【一天一篇CPP】C++的虚基类

来源:互联网 发布:域名在线批量查询 编辑:程序博客网 时间:2024/05/08 02:06

1.一个派生类有多个直接基类,这些基类又有一个共同的基类,如图【画的很随便,就是B和C继承于A,D继承于B和C】


那么D不是有两份A的数据,如果不想保留那么多A的数据,可由使用虚基类。

方法:

class B :  virtual A 

同时

 class C : virtual A

在声明派生类时,指定继承方式的时候声明。这样B和C在派生到D的时候只有一份A的数据了!



2.一个例子:

class A{public:A(int n) : a(n){}int a;};class B : vistual public A{public:B(int n) : A(n){ ......... } //调用A的构造函数};class C : vistual public A{public:C(int n) : A(n){ ........ } //调用A的构造函数};class D : public B, public C{D(int n) :A(n),B(n),C(n){.........}//调用A和B和C的构造函数};//这样在D中只有一份A的数据,它是B和C在继承给D的时候共用的//其中在类D中调用B和C的构造函数的时候不会间接调用A的构造函数【防止不知道调用的先后关系等问题产生的错误】,因此还要D的构造函数直接调用A的构造函数进行构造

在上面这个例子中 

 D d1; 

d1.B::a 和 d1.C::a将是同一个数据!




3.另一个例子,辨识虚继承的作用


假如B和C虚继承于A,而D直接继承于A,E直接继承与B和C和D。

那么B和C在派生到E的时候有一份A的数据,可用   E的对象.B::某个A的成员 和 E的对象.C::某个A的成员名 表示这个成员。

另外D中还有一份A的数据继承到E上,可用 E的对象.D::某个A的成员 表示这个成员。



原创粉丝点击