我是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类对象定义的构造函数的顺序是什么。
我画了一张图: structure of class inheritance http://hi.csdn.net/attachment/201203/16/2712336_1331902452BziD.jpg
我知道虚拟基类总是在非虚基类之前构建,无论它们出现在继承层次结构中的哪个位置。我感到困惑的是,如果Class类的构造函数在Base之前,并且如果Class的构造函数被调用两次。为什么?
有人可以告诉我答案吗?越详细越好。
答案 0 :(得分:8)
Class
和Final
Base
的直接继承不是virtual
,因此Final
的实例 2 类型为Class
的基类子对象。作为Base
的直接基础的那个是在Base
之前构建的,而Final
的直接基础之后的那个是在MI
之后构建的(实际上是在Final
之后)。
原因是:
将(1)应用于Class
告诉我们MI
是在Class
之后构建的。多次应用(2)告诉我们Base
是在Derived1
之前,Derived2
和MI
之前,{{1}}之前构建的。{/ 1}