如何使用非多态基类向下转型

Adr*_*ika 5 c++ dynamic-cast downcast

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

Tad*_*pec 2

虚拟析构函数与向下转型关系不大。使析构函数成为虚拟的目的是允许通过指向基址的指针进行安全删除。

Base * ptr = new Derived;
delete ptr; // undefined behavior if Base destructor isn't virtual
Run Code Online (Sandbox Code Playgroud)

可以使用 执行向下转换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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果强制转换表达式的类型不是多态的,则程序将无法编译。

总而言之,使析构函数成为虚拟将使您的类具有多态性,但通过声明任何其他虚拟成员函数也可以实现相同的效果。要使用dynamic_cast你需要一个多态类型。