繁体   English   中英

有什么方法可以在投射到孩子时使用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_castParent不是多态类型

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

为您的Parent类提供虚拟功能。 出于几个原因(比如通过基础ptr删除子项等),我想到了析构函数。

不,你不能。 使用RTTIRun 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM