2016-06-30 70 views
2

说我,我有这些类:有没有办法使用dynamic_cast投射到孩子?

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其实是一个Child*在运行时?

回答

5

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

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

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

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

给你的Parent类虚拟一个函数。想到析构函数,有几个原因(比如通过基本ptr删除子项等)。

相关问题