class Animal
{
public:
int m_Age;
};
class Sheep: public Animal{};
class Tuo: public Animal{};
class SheepTuo :public Sheep, public Tuo{};
Sheep类和Tuo类都继承Animal类,SheepTuo类又同时继承Sheep类和Tuo类,这时会有两个m_Age,输出m_Age时编译器会报错。
解决方法为:在继承时加一个virtual
class Sheep:virtual public Animal{};
class Tuo:virtual public Animal{};
这时就变成了虚继承,这时公共父类Animal叫做虚基类。
底层原理
在SheepTuo中有两个m_Age。
加入virtual变为虚继承后,从Sheep和Tuo继承过来的变为一个指针——v(virtual)b(base)ptr(pointer)。vbptr指向v(virtual)b(base)table这个表中会记录数据的偏移量,例如图中Sheep的vbtable中偏移量为8,在类中找0+8=8,找到m_Age,同理Tuo中为4+4=8,是同一个数据,这样就不会出现浪费资源的情况了。