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

标签 c++ dynamic-cast downcast

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

最佳答案

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

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 Otherwise, v shall be a pointer to or an lvalue of a polymorphic type (10.3)

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

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

关于c++ - 如何使用非多态基类向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46769981/

相关文章:

c++ - Qt:使用另一个参数创建一个新类

generics - 无法将 dynamic_cast 与泛型一起使用

c++ - 奇怪的交叉转换。这怎么可能?

c++ - 使用 C++,是否有一种安全合法的方法来为涉及多重和虚拟继承的类层次结构实现 “safe cast”,而无需 RTTI?

java - 为什么在向下转换时在编译时不抛出 classcastException?

c++ - 什么是 __rw::__rw_deallocate?

C++ 就地放置 新

c++ - 调用复制构造函数而不是赋值运算符

c++ - dynamic_cast 模板类 "invalid target type for dynamic_cast"

c# - 接口(interface)向下转换