有没有办法在转换为 Child 时使用 dynamic_cast?
Is There a way to use dynamic_cast When Casting to a Child?
说我有这些 类:
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
is not a polymorphic type
所以我无法执行 dynamic_cast
步骤,有没有办法可以验证 arg
实际上是 run-time 处的 Child*
?
给你的 Parent
class 一个虚函数。想到析构函数,有几个原因(比如通过基本 ptr 删除子项等)。
不,你不能。您可以在运行时获取有关对象的信息是使用 RTTI
(Run Time Type Information
) 实现的。对象的 RTTI
存储在其 class 的虚拟 table 中。
多态 class 的每个对象(即具有一个或多个虚函数的 class,或从多态 class 派生的 class)包含一个vptr
,它是指向相应class的虚拟table的指针。非多态类型的对象没有 vptr
并且它的 class 没有虚拟的 table。因此,您不能在非多态类型上使用 dynamic_cast
。
因此,正如@lorro 所说,您应该向 Parent
添加一个虚函数,最简单的选择是添加一个虚析构函数(无论如何您都应该这样做):
struct Parent {
virtual ~Parent() {}
};
说我有这些 类:
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
is not a polymorphic type
所以我无法执行 dynamic_cast
步骤,有没有办法可以验证 arg
实际上是 run-time 处的 Child*
?
给你的 Parent
class 一个虚函数。想到析构函数,有几个原因(比如通过基本 ptr 删除子项等)。
不,你不能。您可以在运行时获取有关对象的信息是使用 RTTI
(Run Time Type Information
) 实现的。对象的 RTTI
存储在其 class 的虚拟 table 中。
多态 class 的每个对象(即具有一个或多个虚函数的 class,或从多态 class 派生的 class)包含一个vptr
,它是指向相应class的虚拟table的指针。非多态类型的对象没有 vptr
并且它的 class 没有虚拟的 table。因此,您不能在非多态类型上使用 dynamic_cast
。
因此,正如@lorro 所说,您应该向 Parent
添加一个虚函数,最简单的选择是添加一个虚析构函数(无论如何您都应该这样做):
struct Parent {
virtual ~Parent() {}
};