Можно ли аргументом функции определить родительский класс, а в теле функции использовать один из дочерних?
Есть класс ClassBase и 2 его дочерних ClassChild1, ClassChild2. Нужно нечто подобное:
foo(ClassBase elem){
// тут работать с объектом одного из дочерних
}
На ум приходят шаблоны, но не могу понять как реализовать это.
Ответы (1 шт):
Во-первых, в таких случаях следует использовать передачу по ссылке, иначе вы столкнетесь со срезкой, если и когда вместо родительского объекта будете передавать дочерний.
Использовать-то дочерний класс можно, только надо использовать приведение dynamic_cast, если не хотите неприятностей. Только он обеспечивает безопасное приведение (или указывает, что оно невозможно).
void foo(ClassBase * elem)
{
...
ChildClass1 * с = dynamic_cast<ChildClass1 *>(elem);
if (c) {
...
Примерно так. При использовании ссылок надо перехватывать исключение bad_cast.
Этим ответ исчерпывается.
А теперь давайте просто подумаем — зачем? Если вы передаете в функцию родительский класс, значит, вы как бы заключаете контракт — при передаче такого объекта родительского класса все будет отлично работать. И если вы действительно передадите объект такого класса, то в нем же просто нет функциональности дочернего класса?
Скорее всего, вы просто "затыкаете" какую-то возникшую дыру, вместо того, чтобы пересмотреть саму конструкцию, проект. Применение такого приведения родителя к ребенку в большинстве случаев признак какой-то недодуманности. Просто подумайте, нет ли иного пути решения вашей проблемы.