我正在用虚拟析构函数做一个小实验来回顾 - 想知道是否有人对以下内容有一个简单的解释(使用 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 个对象 - 为了完整性,将第四个对象保留为 D*。
删除所有 4 个指针。
正如我所预料的,在所有 4 个实例中,完整的析构函数链以从 D 到 A 的相反顺序执行,从而释放所有内存。
第二个实验 -
A 有一个非虚拟析构函数 ** 将 A 更改为非虚拟
B 有一个非虚拟析构函数
C 有一个虚拟析构函数
D 有一个非虚拟析构函数
在 D 类型的堆上分配 4 个对象 - 将 A*、B* 和 C* 的指针指向前 3 个对象 - 为了完整性,将第四个对象保留为 D*。
删除 C* 和 D* 指针:
完整的析构函数链按从 D 到 A 的相反顺序执行,释放所有内存。
删除B*:
B 然后运行 A 析构函数(泄漏)
删除A*:
仅运行析构函数(泄漏)
谁能解释一下这是为什么?
当在实验 2 中分配 D 类型对象时,它的直接基类 (C) 有一个虚拟析构函数 - 这不是告诉编译器用 Vptr 跟踪它并知道内存类型吗?不管参考文献是什么?
谢谢
麦克风
当在实验 2 中分配 D 类型对象时,它的直接基类 (C) 有一个虚拟析构函数 - 这不是告诉编译器用 Vptr 跟踪它并知道内存类型吗?不管参考文献是什么?
No.
在你的第二个测试用例中,A
and B
没有 vptr/vtable。 (即使他们这样做了,非虚拟成员函数仍然会被静态解析,而不是动态解析。)
换句话说,基类不会从派生类“继承”信息(例如函数是否为虚函数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)