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

时间:2013-02-28 20:45:12

标签: c++ inheritance polymorphism virtual-destructor

如果我有以下层次结构:

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

如果调用类F类型的对象的析构函数,则按以下顺序执行以下操作:

  1. 调用类F(最派生的)析构函数并完成
  2. 调用D类(成员对象2)析构函数并完成
  3. 调用E类(成员对象1)析构函数并完成
  4. 调用C类(F的基础)析构函数并完成
  5. A类(B的基数,C的基础)析构函数被调用并完成
  6. 调用B类(虚拟,C的基础)析构函数并完成
  7. 这是对的吗?所以基本上到最后C继承虚拟B而虚拟B继承A,但C被破坏,然后是A,然后是虚拟B?

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

      

    “虚拟基类是特殊的 - 它们的析构函数被调用   最派生类的构造函数“

    的结尾

    这是我想要了解的内容?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

也许最简单的方法是将析构函数调用的顺序表示为算法。

破坏

  1. 执行程序员在析构函数体内编写的任何内容:F::~F() { do_this; do_that; }
  2. 销毁(调用析构函数)成员
  3. 销毁(调用析构函数)非虚拟基类
  4. 销毁(调用析构函数)虚拟基类
  5. 该算法由语言(或编译器)执行,因此程序员只能控制第一步。

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

    析构函数调用的顺序与构造函数调用的顺序相反(很高兴知道,因为构造顺序很直观)。虚拟碱基的破坏顺序指定为

      

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

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