如果一个类有多个基类,基类的构造函数在继承类的构造函数之前被调用。基类的构造函数以被声明的顺序被调用。下面是一个例子:
class Y {...}
class X : public Y {...}
X one;
构造函数的调用顺序是下面的顺序:
Y(); // 基类的构造函数
X(); // 继承类的构造函数
对于多基类的情况,下面是一个例子:
class X : public Y, public Z
X one;
构造函数以声明的次序调用。
Y(); // 基类构造函数首先被调用
Z();
X();
虚基类的构造函数在任何非虚基类构造函数前调用。如果构造中包括多个虚基类,它们的调用顺序以声明顺序为准。如果虚类是由非虚类派生而来,那非虚类的构造函数要先被调用。下面是一个例子:
class X : public Y, virtual public Z
X one;
调用顺序如下:
Z(); // 虚基类初始化
Y(); // 非虚基类
X(); // 继承类
下面是一个复杂的例子:
class base;
class base2;
class level1 : public base2, virtual public base;
class level2 : public base2, virtual public base;
class toplevel : public level1, virtual public level2;
toplevel view;
构造函数调用顺序如下:
base(); // 虚基类仅被构造一次
base2();
level2(); // 虚基类
base2();
level1();
toplevel();
如果类继承中包括多个虚基类的实例,基类只被初始化一次。
在这里想补充一点,虚基类通常是为了在多继承过程中出现了菱形时,防止基类被多次构造。