1 #include <IOSTREAM.H>
2 //基类
3 class CBase
4 ...{
5 protected:
6 int a;
7 public:
8 CBase(int na)
9 ...{
10 a=na;
11 cout<<"CBase constructor! ";
12 }
13
14 ~CBase()...{cout<<"CBase deconstructor! ";}
15 };
16
17 //派生类1(声明CBase为虚基类)
18 class CDerive1:virtual public CBase
19 ...{
20 public:
21 CDerive1(int na):CBase(na)
22 ...{
23 cout<<"CDerive1 constructor! ";
24 }
25
26 ~CDerive1()...{cout<<"CDerive1 deconstructor! ";}
27
28 int GetA()...{return a;}
29 };
30
31 //派生类2(声明CBase为虚基类)
32 class CDerive2:virtual public CBase
33 ...{
34 public:
35 CDerive2(int na):CBase(na)
36 ...{
37 cout<<"CDerive2 constructor! ";
38 }
39 ~CDerive2()...{cout<<"CDerive2 deconstructor! ";}
40 int GetA()...{return a;}
41 };
42
43 //子派生类
44 class CDerive12:public CDerive1,public CDerive2
45 ...{
46 public:
47 CDerive12(int na1,int na2,int na3):CDerive1(na1),CDerive2(na2),CBase(na3)
48 ...{
49 cout<<"CDerive12 constructor! ";
50 }
51 ~CDerive12()...{cout<<"CDerive12 deconstructor! ";}
52 };
53 void main()
54 ...{
55 CDerive12 obj(100,200,300);
56 //得到从CDerive1继承的值
57 cout<<" from CDerive1 : a = "<<obj.CDerive1::GetA();
58 //得到从CDerive2继承的值
59 cout<<" from CDerive2 : a = "<<obj.CDerive2::GetA()<<endl<<endl;
60 }
从上例可以看出,在类CDerived12的构造函数初始化表中,调用了间接基类CBase的构造函数,这对于非虚基类是非法的,但对于虚基类则是合法且必要的。
对于派生类CDerived1和CDerived2,不论是其内部实现,还是实例化的对象,基类CBase是否是它们的虚基类是没有影响的。受到影响的是它们的派生类CDerived12,因为它从两条路径都能到达CBase。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/livelylittlefish/archive/2008/03/11/2171267.aspx
原文链接: https://www.cnblogs.com/biyongyao/p/5041474.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/225734
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!