#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;
}
一.菱形繼承
- 羊繼承了動物的數據,駝也繼承了動物的數據,當羊駝使用數據的時候,就會產生二義性(可以通過加作用域解決)
- 羊駝繼承自動物的數據繼承了兩份,這將會造成資源浪費
原來動物的數據會被繼承兩份,現在用虛繼承,有了虛基類指針,指向虛基類表,就可以只有一份數據。