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的成员 表示这个成员。