虚继承的必要性
解决菱形继承带来的数据冗余和二义性。由于B 和C都继承了类A,那么B和C中就各有一份A的内容,而D又分别继承了B和C,那么D中就有两份a,造成了数据冗余,而且在访问_a成员时,就会有二义性的产生,指向不明。所以为了解决这种问题引出了虚继承
什么是虚继承
虚继承就是在B和C在继承A时加上关键字virtual就是虚继承了,
#include<iostream>
using namespace std;
class A{
public:
int _a;
};
class B :virtual public A{
public:
int _b;
};
class C :virtual public A{
public:
int _c;
};
class D :public B,public C{
public:
int _d;
};
int main(){
D d;
d._a=1;
d._b = 2;
d._c = 3;
d._d = 4;
cout<<sizeof(d)<<endl;// 20 //虚继承后大小变为24
system("pause");
return 0;
}
为什么虚继承后D的大小反而变量大了,这岂不是不能达到解决数据冗余的效果了?
,按照结果来看是不是觉得并没有达到解决数据冗余的问题,这是因为A中的数据少,如果A中的成员很多,空间很大,那么两个指针的作用就很大了,可以省略很多空间的开销。