说我有这些课程:
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*
?
答案 0 :(得分:8)
为您的Parent
班级提供虚拟功能。出于几个原因(例如通过基础ptr删除子项等),我想到了析构函数。
答案 1 :(得分:5)
RTTI
(Run Time Type Information
)可以获得有关运行时对象的信息。对象的RTTI
存储在其类的虚拟表中。
多态类的每个对象(即具有一个或多个虚函数的类,或从多态类派生的类)包含vptr
,它是指向虚拟表的指针。相应的课程。非多态类型的对象没有vptr
,并且没有其类的虚拟表。因此,您无法在非多态类型上使用dynamic_cast
。
所以,正如@lorro所说,你应该向Parent
添加一个虚函数,最简单的选择是添加一个虚拟析构函数(无论如何你应该这样做):
struct Parent {
virtual ~Parent() {}
};