#include <iostream>
using namespace std;
class Animal
{
public:
int m_age;
};
//利用虚继承可以解决菱形继承
//animal称为虚基类
class Sheep :virtual public Animal
{
};
class Tuo :virtual public Animal
{
};
class SheepTuo :public Sheep, public Tuo
{
};
void test1()
{
SheepTuo st;
//两个父类有相同的数据,需要加作用域加以区分
st.Sheep::m_age = 18;
st.Tuo::m_age = 28;
//数据只需要一份,菱形继承造成了两份数据,浪费了资源
//vbptr(虚基类指针)指向vbtable(虚基类表),表中记录偏移量,继承vbptr之后,通过vbptr指向detable,查询table中的偏移量,可以查到数据,解决了数据重复的问题
cout << st.m_age << endl;
}
int main()
{
test1();
return 0;
}
一.菱形继承
- 羊继承了动物的数据,驼也继承了动物的数据,当羊驼使用数据的时候,就会产生二义性(可以通过加作用域解决)
- 羊驼继承自动物的数据继承了两份,这将会造成资源浪费
原来动物的数据会被继承两份,现在用虚继承,有了虚基类指针,指向虚基类表,就可以只有一份数据。