C++派生类继承的理解

 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 */ 
原文地址:https://www.cnblogs.com/sytu/p/4112249.html