虚拟继承中的构造函数顺序

时间:2012-03-16 12:57:59

标签: c++

我是C ++的新生,特别是关于面向对象的编程。现在我在学习期间遇到了问题。

以下是一个类层次结构:

class Class{};

class Base:public Class{};

class Derived1:virtual public Base{};

class Derived2:virtual public Base{};

class MI:public Derived1,public Derived2{};

class Final:public MI,public Class{};

现在我想知道Final类对象定义的构造函数的顺序是什么。

我画了一张图: enter image description here structure of class inheritance http://hi.csdn.net/attachment/201203/16/2712336_1331902452BziD.jpg

我知道虚拟基类总是在非虚基类之前构建,无论它们出现在继承层次结构中的哪个位置。我感到困惑的是,如果Class类的构造函数在Base之前,并且如果Class的构造函数被调用两次。为什么?

有人可以告诉我答案吗?越详细越好。

1 个答案:

答案 0 :(得分:8)

ClassFinal Base的直接继承不是virtual,因此Final的实例 2 类型为Class的基类子对象。作为Base的直接基础的那个是在Base之前构建的,而Final的直接基础之后的那个是在MI之后构建的(实际上是在Final之后)。

原因是:

  1. 直接基地按照它们列出的顺序构建(除非它们是已经构建的虚拟基础),
  2. base是在类自己的构造函数运行之前构造的。
  3. 将(1)应用于Class告诉我们MI是在Class之后构建的。多次应用(2)告诉我们Base是在Derived1之前,Derived2MI之前,{{1}}之前构建的。{/ 1}