提问者:小点点

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


如果我有以下层次结构:

  • F类包含类型的成员对象(E类和D类,按该顺序声明)
  • 类F继承具体类C
  • C类继承抽象/纯虚拟类B类
  • 类B继承具体类A

如果调用F类类型对象的析构函数,则按以下顺序发生:

  1. 调用F类(最派生的)析构函数并完成
  2. 调用D类(成员对象2)析构函数并完成
  3. 调用E类(成员对象1)析构函数并完成
  4. 调用C类(F的基础)析构函数并完成
  5. 类A(B的基础,即C的基础)析构函数被调用并完成
  6. 调用B类(虚拟,C的基础)析构函数并完成

这是正确的吗?所以基本上最后C继承了虚拟B,虚拟B继承了A,但是C被销毁了,然后是A,然后是虚拟B?

编辑:C常见问题解答说:

"虚拟基类是特殊的,它们的析构函数在最底层的派生类构造函数的末尾被调用。"

这就是我试图理解的?


共2个答案

匿名用户

析构函数以与构造函数相反的顺序执行。这几乎就是您需要知道的全部内容。

更新:它甚至适用于虚拟基类。你只需要意识到虚拟基类是在任何其他基类之前构建的。

匿名用户

也许最容易将析构函数调用的顺序表示为算法。

  1. 执行程序员在析构函数体中编写的任何操作:F::~F(){do_this;do_that;}
  2. 销毁(调用析构函数)成员
  3. 销毁(调用析构函数)非虚基类
  4. 销毁(调用析构函数)虚拟基类

该算法由语言(或编译器)执行,因此程序员只能控制第一步。

注意:每个进一步的步骤都是递归的。

析构函数调用的顺序是构造函数调用的倒序(知道就好,因为构造顺序直观)。虚基的销毁顺序指定为

深度优先从左到右遍历基类的图

幸运的是,你不需要这个,因为你只有一个。