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

标签 c++ virtual-destructor

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

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

进行了 2 个实验:

第一次实验——

A 有一个虚拟析构函数。

B 有一个非虚拟析构函数

C 有一个虚拟析构函数

D 有一个非虚拟析构函数

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

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

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

第二个实验——

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

B 有一个非虚拟析构函数

C 有一个虚拟析构函数

D 有一个非虚拟的析构函数

在类型 D 的堆上分配 4 个对象 - 将 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++ 中递归地反转负整数?

c++ - OpenCL 管道无法使用 cl_mem_object_allocation_failure 分配缓冲区

c++ - 运行 winapi 程序时显示的控制台

c++ - 何时使用虚拟析构函数?

c++ - 在 C++11 中的析构函数之后覆盖标识符

c++ - 基类析构函数不是虚拟的,子类析构函数是虚拟的,程序崩溃

c++ - vector 下标超出范围

c++ - 你如何在不暴露你的内部结构的情况下与 Pimpl 交换私有(private)数据?

c++ - 继承层次结构中的析构函数排序

c++ - Valgrind 在 std::make_unique 中显示内存泄漏