1 #include<iostream> 2 using namespace std; 3 class Base{ 4 public: 5 Base() 6 { 7 a=5; 8 cout<<"Base a="<<a<<endl; 9 } 10 protected: 11 int a;//如果这里是私有的变量,则在他的所有派生类中都不具有访问权限 12 //派生类只能直接访问基类 的公有和保护成员 13 //私有成员仅限于自己使用。 14 //保护成员则允许派生类使用,而不允许通过对象进行直接调用 15 //公有类是允许所有的调用 16 }; 17 class Base1:virtual public Base{ 18 public: 19 int b1; 20 Base1() 21 { 22 a=a+10; 23 cout<<"Base1 a="<<a<<endl; 24 } 25 }; 26 class Base2:virtual public Base{ 27 public: 28 int b2; 29 Base2() 30 { 31 a=a+20; 32 cout<<"Base2 a="<<a<<endl; 33 } 34 }; 35 class Derived:public Base1,public Base2{ 36 public: 37 int d; 38 Derived() 39 { 40 cout<<"Base1::a="<<Base1::a<<endl; 41 cout<<"Base2::a="<<Base2::a<<endl; 42 } 43 }; 44 //定义虚基类是对同一个基类只复制一次。 45 //从本例函数执行结果看出: 46 //由Derived类的创建,会导致Base1类的创建,然后是Base2的创建 47 //要创建Base1类必先创建他的派生类Base 48 //Base类创建后接着Base1创建,然后此时Base类被调用了一次 49 //Base1类创建结束后再创建Base2. 50 //因为是虚继承,Base已经被调用过一次,此时它不再调用Base类 51 //Base2会用在Base1创建的基础上调用的Base类的值。 52 //在所有的基类被依次创建后,然后再创建 最底层的派生类Derived 53 int main() 54 { 55 Derived obj; 56 return 0; 57 } 58 /* 59 在虚继承时的执行结果 60 Base a=5 61 Base1 a=15 62 Base2 a=35 63 Base1::a=35 64 Base2::a=35 65 */ 66 /* 67 在非虚继承时执行的结果 68 Base a=5 69 Base1 a=15 70 Base a=5 71 Base2 a=25 72 Base1::a=15 73 Base2::a=25 74 */