虚基类的初始化
虚基类的初始化在语法上和一般基类一样,只是调用顺序略有不同,
它遵循以下顺序:
虚基类的构造函数在非虚基类之前调用
若同一层次中包含多个虚基类,则按它们在派生类中声明虚基类时被指定的顺序调用
若虚基类由非虚基类派生而来,要先调用更高级别基类的构造函数,
再遵循上述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 的构造函数
