1. 程式人生 > 其它 >c++菱形繼承

c++菱形繼承

  

菱形繼承概念:

​ 兩個派生類繼承同一個基類

​ 又有某個類同時繼承者兩個派生類

​ 這種繼承被稱為菱形繼承,或者鑽石繼承

典型的菱形繼承案例:

菱形繼承問題:

  1. 羊繼承了動物的資料,駝同樣繼承了動物的資料,當草泥馬使用資料時,就會產生二義性。
    
  2. 草泥馬繼承自動物的資料繼承了兩份,其實我們應該清楚,這份資料我們只需要一份就可以。

示例:

 

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; }

結果:

 

 

總結:

  • 菱形繼承帶來的主要問題是子類繼承兩份相同的資料,導致資源浪費以及毫無意義
  • 利用虛繼承可以解決菱形繼承問題,這相同的資料會指向同一個地方。