在铸造孩子时,有没有一种方法可以使用Dynamic_cast

Is There a way to use dynamic_cast When Casting to a Child?

本文关键字:方法 一种 可以使 cast Dynamic 孩子 有没有      更新时间:2023-10-16

说我有这些类:

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

现在说我想创建这样的函数:

void foo(Parent* arg) {
    auto child = dynamic_cast<Child*>(arg);
    if(child != nullptr) child->func();
}

,但显然这显然会给我带来错误:

dynamic_castParent不是多态类型

所以我不能执行dynamic_cast步骤,有没有一种方法可以验证arg实际上是在运行时是Child*

给您的Parent类虚拟函数。出于几个原因,毁灭者想到了(例如通过基本PTR删除孩子等)。

不,你不能。您可以使用RTTIRun Time Type Information)实现有关对象的信息。对象的RTTI存储在其类的虚拟表中。

多态类别的每个对象(即具有一个或多个虚拟函数的类,或从多态类派生的类中的类)包含一个vptr,这是指向相应类的虚拟表的指针。非造型类型的对象没有vptr,并且没有一个虚拟表。因此,您不能在非造型类型上使用dynamic_cast

因此,正如@lorro所说,您应该向Parent添加虚拟函数,最简单的选项是添加虚拟破坏者(无论如何您都应该这样做):

struct Parent {
    virtual ~Parent() {} 
};
相关文章: