Есть ли способ использовать dynamic_cast при приведении к ребенку?

Скажите, что я, что у меня есть эти классы:

struct Parent {};
struct Child : public Parent {
void func() {}
};

Теперь скажите, что я хотел создать такую ​​функцию:

void foo(Parent* arg) {
auto child = dynamic_cast<Child*>(arg);

if(child != nullptr) child->func();
}

Но очевидно, что это, очевидно, даст мне ошибку:

dynamic_cast: Parent не является полиморфным типом

Так что я не могу сделать dynamic_cast шаг, есть ли способ, которым я могу подтвердить, что arg на самом деле Child* во время выполнения?

2

Решение

Нет, ты не можешь. Информация, которую вы можете получить об объекте во время выполнения, достигается с помощью RTTI (Run Time Type Information). RTTI объекта хранится в виртуальной таблице своего класса.

Каждый объект полиморфного класса (то есть класс, который имеет одну или несколько виртуальных функций, или класс, производный от полиморфного класса) содержит vptr, который является указателем на виртуальную таблицу соответствующего класса. Объект неполиморфного типа не имеет vptr и нет виртуальной таблицы для своего класса. Поэтому вы не можете использовать dynamic_cast на неполиморфных типах.

Итак, как сказал @lorro, вы должны добавить виртуальную функцию в Parent, и самый простой вариант — добавить виртуальный деструктор (что вы должны сделать в любом случае):

struct Parent {
virtual ~Parent() {}
};
5

Другие решения

Отдай свое Parent Класс виртуальной функции. Разрушитель приходит в голову по нескольким причинам (например, удаление потомка через базовый ptr и т. Д.).

8

По вопросам рекламы [email protected]