问题:1.虚拟继承的作用
2.底层的工作原理
1.作用:
#include <iostream>
using namespace std;
class AA
{
public:
int _aa;
};
class BB : public AA
{
public:
int _bb;
};
class CC : public AA
{
public:
int _cc;
};
class DD : public BB, public CC
{
public:
int _dd;
};
void Test()
{
DD d;
d.BB::_aa = 0;
d.CC::_aa = 1;
d._bb = 2;
d._cc = 3;
d._dd = 4;
cout << sizeof(BB) << endl;//12
}
int main()
{
Test();
return 0;
}
在这个代码中DD中有了两份AA成员,菱形继承存在二义性和数据冗余问题
因此引进了虚拟继承解决了菱形继承的二义性和数据冗余
2.原理
这是菱形继承的内存图
代码为1中的代码
虚拟继承 加virtual
代码如下:
#include <iostream>
using namespace std;
class AA
{
public:
int _aa;
};
class BB : virtual public AA
{
public:
int _bb;
};
class CC : virtual public AA
{
public:
int _cc;
};
class DD : public BB, public CC
{
public:
int _dd;
};
void Test()
{
DD d;
d.BB::_aa = 0;
d.CC::_aa = 1;
d._bb = 2;
d._cc = 3;
d._dd = 4;
cout << sizeof(BB) << endl;//12
}
int main()
{
Test();
return 0;
}
内存图如下: