Скажите, что я, что у меня есть эти классы:
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*
во время выполнения?
Нет, ты не можешь. Информация, которую вы можете получить об объекте во время выполнения, достигается с помощью RTTI
(Run Time Type Information
). RTTI
объекта хранится в виртуальной таблице своего класса.
Каждый объект полиморфного класса (то есть класс, который имеет одну или несколько виртуальных функций, или класс, производный от полиморфного класса) содержит vptr
, который является указателем на виртуальную таблицу соответствующего класса. Объект неполиморфного типа не имеет vptr
и нет виртуальной таблицы для своего класса. Поэтому вы не можете использовать dynamic_cast
на неполиморфных типах.
Итак, как сказал @lorro, вы должны добавить виртуальную функцию в Parent
, и самый простой вариант — добавить виртуальный деструктор (что вы должны сделать в любом случае):
struct Parent {
virtual ~Parent() {}
};
Отдай свое Parent
Класс виртуальной функции. Разрушитель приходит в голову по нескольким причинам (например, удаление потомка через базовый ptr и т. Д.).