[英]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
不是多态类型
所以我不能做dynamic_cast
步骤,有没有办法可以在运行时验证arg
实际上是一个Child*
?
为您的Parent
类提供虚拟功能。 出于几个原因(比如通过基础ptr删除子项等),我想到了析构函数。
不,你不能。 使用RTTI
( Run Time Type Information
)可以获得有关运行时对象的Run Time Type Information
。 对象的RTTI
存储在其类的虚拟表中。
多态类的每个对象(即具有一个或多个虚函数的类,或从多态类派生的类)包含vptr
,它是指向相应类的虚拟表的指针。 非多态类型的对象没有vptr
并且没有其类的虚拟表。 因此,您不能在非多态类型上使用dynamic_cast
。
因此,正如@lorro所说,你应该向Parent
添加一个虚函数,最简单的选择是添加一个虚拟析构函数(无论如何你应该这样做):
struct Parent {
virtual ~Parent() {}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.