如何使用非多态基类进行向下转换

时间:2017-10-16 12:08:13

标签: c++ dynamic-cast downcast

在C ++中,没有让我的析构函数虚拟是否仍然可以向下转换我的非多态基类的指针/引用?

1 个答案:

答案 0 :(得分:1)

虚拟析构函数与向下转换几乎没有关系。使析构函数虚拟化的目的是允许通过指向base的安全删除。

Base * ptr = new Derived;
delete ptr; // undefined behavior if Base destructor isn't virtual

可以使用static_cast执行向下转发,由您自己负责

void processBase(Base * ptr)
{
    // undefined behavior if ptr does not point to Derived
    // object or some object that inherits from Derived
    Derived * derived = static_cast<Derived *>(ptr);
}

还有dynamic_cast将检查向下转换是否合法,但它要求转换表达点(或引用)指向多态对象(即至少声明或继承了一个虚函数的对象)。

  

5.2.7.6否则,v应为多态类型的指针或左值(10.3)

如果铸造表达式的类型不是多态的,程序将无法编译。

总结一下 - 使析构函数虚拟化将使您的类具有多态性,但通过声明任何其他虚拟成员函数将实现相同的功能。要使用dynamic_cast,您需要一个多态类型。