虚基类的初始化

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

  1. class A;
  2. class B;
  3. class C : public A, virtual B
  4. {
  5. };
  6. 将产生如下的调用次序:
  7. B( )
  8. A( )
  9. C( )

示例2

  1. class Base1 // 定义基类Base1
  2. {
  3. public: Base1(){cout <<"class Base1"<<endl; } //构造函数
  4. };
  5. class Base2 // 定义基类Base2
  6. {
  7. public: Base2() { cout <<"class Base2"<<endl; } //构造函数
  8. };
  9. class Level1: public Base2, virtual public Base1 // 定义派生类Level1
  10. {
  11. public: Level1() { cout <<"class Level1"<<endl; } //构造函数
  12. };
  13. class Level2: public Base2, virtual public Base1// 定义派生类Level2
  14. {
  15. public: Level2() { cout << "class Level2" <<endl; } //构造函数
  16. };
  17. class Leaf: public Level1, virtual public Level2 //定义派生类Leaf
  18. {
  19. public: Leaf() { cout << "class Leaf" <<endl; }
  20. };
  21. int main()
  22. {
  23. Leaf obj; //创建一个派生类Leaf的对象
  24. return 0;
  25. }

输出
image.png
先调用level2 构造函数,将所有level2 构造函数执行完成,再调用level1 的构造函数