4 级继承链中的 C++ 虚拟析构函数。

标签 c++ virtual-destructor

我正在用虚拟析构函数做一个小实验来复习——想知道是否有人对以下内容有一个简单的解释(使用 vs 2010):

我定义类层次结构A-B-C-D,D继承C,C继承B,B继承A,A是Base;

运行了 2 个实验:

第一个实验-

A 有一个虚拟析构函数。

B 有一个非虚析构函数

C有一个虚拟析构函数

D有一个非虚析构函数

//----------------------------

在堆上分配 4 个 D 类型的对象 - 将 A*、B* 和 C* 的指针指向前 3 个 - 将第 4 个保留为 D* 以确保完整性。 删除所有 4 个指针。

如我所料,在所有 4 个实例中,完整的析构函数链以相反的顺序从 D 向下执行到 A,释放所有内存。

第二个实验-

A 有一个非虚拟析构函数 ** 将 A 更改为非虚拟

B 有一个非虚析构函数

C有一个虚拟析构函数

D有一个非虚拟的Distructor

在堆上分配 4 个 D 类型的对象 - 将 A*、B* 和 C* 的指针指向前 3 个 - 将第 4 个保留为 D* 以确保完整性。

删除 C* 和 D* 指针: 完整的析构函数链从 D 到 A 以相反的顺序执行,释放所有内存。

删除 B*: B 然后运行 ​​A 析构函数(泄漏)

删除 A*: 只有一个析构函数运行(泄漏)

谁能解释这是为什么?

当在实验 2 中分配 D 类型对象时,它的直接基类 (C) 有一个虚拟析构函数——这不是告诉编译器用 Vptr 跟踪它并知道内存类型吗?不管引用文献是什么?

谢谢 迈克

最佳答案

When D type opjects are allocated in experiment 2, its immediate base class (C) has a virtual destructor - doesnt that tell the compiler to track it with a Vptr and know the memory type? REGARDLESS of the reference?

没有。

在你的第二个测试用例中,AB 没有 vptrs/vtables。 (即使他们这样做了,非虚拟成员函数仍然会静态解析,而不是动态解析。)

换句话说,基类不会从派生类“继承”信息(例如函数是否为虚函数)。

关于4 级继承链中的 C++ 虚拟析构函数。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055089/

相关文章:

c++ - 如何在不破坏移动和复制构造函数的情况下声明虚拟析构函数

c++ - 如果您始终将其存储在 shared_ptr 中,您的接口(interface)是否需要虚拟析构函数?

c++ - 调用派生和基类析构函数的虚拟析构函数

c++ - 手动设置重载函数的优先级

c++ - 泛化编译时和运行时评估

c++ - 可以清除流的单个错误状态标志吗?

c++ - 为什么要在 C++ 中为抽象类声明虚拟析构函数?

c++ - 我怎样才能用osg api在osgearth上画一个三角形

C++:实例化库中的许多模板

c++ - 类具有虚函数和可访问的非虚析构函数