有什么方法可以在投射到孩子时使用dynamic_cast吗?

时间:2016-06-30 14:00:58

标签: c++ polymorphism dynamic-cast downcast

说我有这些课程:

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*

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

不,你不能。使用RTTIRun Time Type Information)可以获得有关运行时对象的信息。对象的RTTI存储在其类的虚拟表中。

多态类的每个对象(即具有一个或多个虚函数的类,或从多态类派生的类)包含vptr,它是指向虚拟表的指针。相应的课程。非多态类型的对象没有vptr,并且没有其类的虚拟表。因此,您无法在非多态类型上使用dynamic_cast

所以,正如@lorro所说,你应该向Parent添加一个虚函数,最简单的选择是添加一个虚拟析构函数(无论如何你应该这样做):

struct Parent {
    virtual ~Parent() {} 
};