利用虚继承解决菱形继承的问题
菱形继承示例
#include <iostream>
using namespace std;
class Animal //定义一个虚基类
{
public:
int m_Age;
};
//继承之前 加上关键字virtual变为虚继承
//利用开发者指令提示可以查看数据打印内容 c1/ dl reportSingleClassLayout 类名 文件名
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201227171541750.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RvdXppZ3VvUXZR,size_16,color_FFFFFF,t_70#pic_center)
//从基类继承过来的数据只有一份vbptr指向vbtable
// virtual base pointer
// vbtable记录指针偏移量
// 指针原地址+指针偏移量得到的数据能找到Age
class Sheep :virtual public Animal{};
class Tuo :virtual public Animal{};
class SheepTuo :public Sheep, public Tuo{};
void test01()
{
SheepTuo st; //将羊驼实例化一个对象
st.Sheep::m_Age = 18;
st.Tuo::m_Age = 28;
//这份数据只要有一份就可以了,菱形继承导致数据有两份,导致资源浪费
//当出现菱形继承的时候,有两个父类拥有相同的数据,需要加以作用域区分
//cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl;
//cout << "st.Tuo::m_Age = " << st.Tuo::m_Age << endl;
cout << "st.m_Age = " << st.m_Age << endl;
}
int main()
{
test01();
system("pause");
return 0;
}