c++菱形繼承
阿新 • • 發佈:2022-04-10
菱形繼承概念:
兩個派生類繼承同一個基類
又有某個類同時繼承者兩個派生類
這種繼承被稱為菱形繼承,或者鑽石繼承
典型的菱形繼承案例:
菱形繼承問題:
-
羊繼承了動物的資料,駝同樣繼承了動物的資料,當草泥馬使用資料時,就會產生二義性。
-
草泥馬繼承自動物的資料繼承了兩份,其實我們應該清楚,這份資料我們只需要一份就可以。
示例:
class Animal { public: int m_Age; }; //繼承前加virtual關鍵字後,變為虛繼承 //此時公共的父類Animal稱為虛基類 class Sheep : virtual public Animal {};class Tuo : virtual public Animal {}; class SheepTuo : public Sheep, public Tuo {}; void test01() { SheepTuo st; st.Sheep::m_Age = 100; st.Tuo::m_Age = 200; cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl; cout << "st.Tuo::m_Age = " << st.Tuo::m_Age << endl;//虛繼承之後就會解決子類繼承兩份相同的資料帶來的問題,呼叫m_Age的時候可以直接呼叫,不用如 //上面加類作用域了。 cout << "st.m_Age = " << st.m_Age << endl; } int main() { test01(); system("pause"); return 0; }
結果:
總結:
- 菱形繼承帶來的主要問題是子類繼承兩份相同的資料,導致資源浪費以及毫無意義
- 利用虛繼承可以解決菱形繼承問題,這相同的資料會指向同一個地方。