2020.05.30C++:多種繼承

1.多重繼承-菱形繼承

類 A 派生出類 B 和類 C,類 D 繼承自類 B 和類 C,這個時候類 A 中的成員變量和成員函數繼承到類 D 中變成了兩份,一份來自 A-->B-->D 這條路徑,另一份來自 A-->C-->D 這條路徑。

在一個派生類中保留間接基類的多份同名成員,雖然可以在不同的成員變量中分別存放不同的數據,但大多數情況下這是多餘的:因爲保留多份成員變量不僅佔用較多的存儲空間,還容易產生命名衝突。假如類 A 有一個成員變量 a,那麼在類 D 中直接訪問 a 就會產生歧義,編譯器不知道它究竟來自 A -->B-->D 這條路徑,還是來自 A-->C-->D 這條路徑。

2.多重繼承-虛繼承

爲了解決多繼承時的命名衝突和冗餘數據問題,C++ 提出了虛繼承,使得在派生類中只保留一份間接基類的成員。

在繼承方式前面加上 virtual 關鍵字就是虛繼承,請看下面的例子:

//間接基類A
class A{
protected:
    int m_a;
};

//直接基類B
class B: virtual public A{  //虛繼承
protected:
    int m_b;
};

//直接基類C
class C: virtual public A{  //虛繼承
protected:
    int m_c;
};

//派生類D
class D: public B, public C{
public:
    void seta(int a){ m_a = a; }  //正確
    void setb(int b){ m_b = b; }  //正確
    void setc(int c){ m_c = c; }  //正確
    void setd(int d){ m_d = d; }  //正確
private:
    int m_d;
};

int main(){
    D d;
    return 0;
}

這段代碼使用虛繼承重新實現了上圖所示的菱形繼承,這樣在派生類 D 中就只保留了一份成員變量 m_a,直接訪問就不會再有歧義了。虛繼承的目的是讓某個類做出聲明,承諾願意共享它的基類。其中,這個被共享的基類就稱爲虛基類(Virtual Base Class),本例中的 A 就是一個虛基類。在這種機制下,不論虛基類在繼承體系中出現了多少次,在派生類中都只包含一份虛基類的成員。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章