是否需要定义虚拟析构函数
Is it a requirement to define a virtual destructor?
C++析构函数是否需要定义为虚拟的?如果是这样,为什么?我已经读到,当将基类指针强制转换为派生类时,它们需要确保适当的清理。
需要虚拟析构函数才能允许将析构函数调用动态调度到层次结构树中的正确类。
在以下情况下:
Base *d = new Derived();
delete d;
如果没有 virtual
析构函数,您将有未定义的行为。这是因为编译器无法为Derived
找到最专业的析构函数,因为它没有声明为 virtual
。
它不是正式要求的 - 你可以很容易地编译一个带有虚函数的类,但不能编译一个虚拟析构函数,但这是不明智的。
假设您有一个基类 A,以及两个派生类 B 和 C.B 和 C 具有不同的字段,需要在析构函数中进行不同的清理。
现在你分配
A *p = new B();
然后,当您致电时
delete p;
编译器不知道要调用哪个析构函数(实际上,根据C++标准,这是一种未定义的行为)。
如果不定义虚拟析构函数,则只能调用 A 的析构函数,这在我们假设的类 B 的情况下是不够的。
如果您从不使用 new
关键字实例化您的类(然后delete
它),则不需要虚拟析构函数。但是,添加虚拟析构函数不会影响性能,因此最好始终提供它。
相关文章:
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 程序永远不会进入虚拟析构函数
- C++ std::vector 中的虚拟析构函数继承
- 哪种方法更适合处理虚拟析构函数?
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 带有未解析外部元素的C++虚拟析构函数
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++切片和虚拟析构函数
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 添加虚拟析构函数会使代码大小膨胀
- 应该是虚拟析构函数吗?但是怎么做呢?
- 虚拟析构函数将对象移出 rodata 部分
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用
- DIRECTX9 中自定义顶点的虚拟析构函数
- 为什么缺少虚拟析构函数不会导致内存泄漏?
- std::unique_ptr 在虚拟析构函数上重置 SIGABRT
- C++11 中默认纯虚拟析构函数的正确放置
- 在派生类中重写哪个基类的虚拟析构函数