1.什么是菱形继承
俩个子类继承同一个父类,而又有子类同时继承这俩个子类,如下图所示;
#include <iostream>
#include <windows.h>
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;
};
int main()
{
DD d;
d.BB::_aa = 0;
d.CC::_aa = 1;
d._bb = 2;
d._cc = 3;
d._dd = 4;
system("pause");
return 0;
}
2.菱形继承带来二义性和数据冗余的问题
菱形继承对象模型
3.虚继承解决菱形继承带来的问题
#include <iostream>
#include <windows.h>
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;
};
int main()
{
DD d;
d.BB::_aa = 0;
d.CC::_aa = 1;
d._bb = 2;
d._cc = 3;
d._dd = 4;
system("pause");
return 0;
}
虚继承对象模型
在这里,BB,CC保存的不再是AA的内容,而是偏移地址,把AA的内容放在公共位置处