虚基类的初始化
虚基类的初始化在语法上和一般基类一样,只是调用顺序略有不同,
它遵循以下顺序:
虚基类的构造函数在非虚基类之前调用
若同一层次中包含多个虚基类,则按它们在派生类中声明虚基类时被指定的顺序调用
若虚基类由非虚基类派生而来,要先调用更高级别基类的构造函数,
再遵循上述1和2的顺序
示例1
class A;
class B;
class C : public A, virtual B
{
};
将产生如下的调用次序:
B( )
A( )
C( )
示例2
class Base1 // 定义基类Base1
{
public: Base1(){cout <<"class Base1"<<endl; } //构造函数
};
class Base2 // 定义基类Base2
{
public: Base2() { cout <<"class Base2"<<endl; } //构造函数
};
class Level1: public Base2, virtual public Base1 // 定义派生类Level1
{
public: Level1() { cout <<"class Level1"<<endl; } //构造函数
};
class Level2: public Base2, virtual public Base1// 定义派生类Level2
{
public: Level2() { cout << "class Level2" <<endl; } //构造函数
};
class Leaf: public Level1, virtual public Level2 //定义派生类Leaf
{
public: Leaf() { cout << "class Leaf" <<endl; }
};
int main()
{
Leaf obj; //创建一个派生类Leaf的对象
return 0;
}
输出
先调用level2 构造函数,将所有level2 构造函数执行完成,再调用level1 的构造函数