Можно ли аргументом функции определить родительский класс, а в теле функции использовать один из дочерних?

Есть класс ClassBase и 2 его дочерних ClassChild1, ClassChild2. Нужно нечто подобное:

foo(ClassBase elem){
    // тут работать с объектом одного из дочерних
}

На ум приходят шаблоны, но не могу понять как реализовать это.


Ответы (1 шт):

Автор решения: Harry

Во-первых, в таких случаях следует использовать передачу по ссылке, иначе вы столкнетесь со срезкой, если и когда вместо родительского объекта будете передавать дочерний.

Использовать-то дочерний класс можно, только надо использовать приведение dynamic_cast, если не хотите неприятностей. Только он обеспечивает безопасное приведение (или указывает, что оно невозможно).

void foo(ClassBase * elem)
{
    ...
    ChildClass1 * с = dynamic_cast<ChildClass1 *>(elem);
    if (c) {
        ...

Примерно так. При использовании ссылок надо перехватывать исключение bad_cast.

Этим ответ исчерпывается.

А теперь давайте просто подумаем — зачем? Если вы передаете в функцию родительский класс, значит, вы как бы заключаете контракт — при передаче такого объекта родительского класса все будет отлично работать. И если вы действительно передадите объект такого класса, то в нем же просто нет функциональности дочернего класса?

Скорее всего, вы просто "затыкаете" какую-то возникшую дыру, вместо того, чтобы пересмотреть саму конструкцию, проект. Применение такого приведения родителя к ребенку в большинстве случаев признак какой-то недодуманности. Просто подумайте, нет ли иного пути решения вашей проблемы.

→ Ссылка