1 #include<iostream> 2 using namespace std; 3 class Base{ 4 public: 5 Base(int sa) 6 { 7 a=sa; 8 cout<<"Constructing Base"<<endl; 9 } 10 private://私有变量,不可在派生类中直接使用 11 int a; 12 }; 13 class Base1:virtual public Base{ 14 public: 15 Base1(int sa,int sb):Base (sa) 16 { 17 b=sb; 18 cout<<"Constructing Base1"<<endl; 19 } 20 private: 21 int b; 22 }; 23 class Base2:virtual public Base{ 24 public: 25 Base2(int sa,int sc):Base(sa) 26 { 27 c=sc; 28 cout<<"Constructing Base2"<<endl; 29 } 30 private: 31 int c; 32 }; 33 class Derived:public Base1,public Base2{ 34 public: 35 Derived(int sa,int sb,int sc,int sd) 36 :Base(sa),Base1(sa,sb),Base2(sa,sc) 37 //如果Base类不是虚基类,就不能使用这种方式调用基类的构造函数 38 { 39 d=sd; 40 cout<<"Constructing Derived"<<endl; 41 } 42 private: 43 int d; 44 }; 45 int main() 46 { 47 Derived obj(2,4,6,8); 48 return 0; 49 } 50 51 /* 52 执行结果 53 Constructing Base 54 Constructing Base1 55 Constructing Base2 56 Constructing Derived 57 */
从分析上述程序中虚基类Base的构造函数只执行了一次。
显然,当Derived的构造调用了虚基类Base的构造函数之后,
类Base1和类Base2对Base构造函数的调用被忽略了,这也是初始化虚基类
和初始化非虚基类不同的地方。
关键字virtual与派生方式关键字(public或private)的先后顺序无关紧要,
他只说明是“虚拟派生”。
一个基类在作为某些派生类虚基类的同时,又作为另一些派生类的非虚基类,
这种情况是允许的。