MI 多重繼承 虛繼承

2021-07-11 00:07:10 字數 1901 閱讀 4951

1,沒有虛繼承的mi

#include #include using namespace std;

/*mi(多重繼承)

虛基類*/

/*mi繼承圖:

test_base

/ \

/ \

test1 test1_1

\ /

\ /

test2

*/class test_bae //基類 test_base

virtual void show() };

class test1:public test_bae //test_base的派生類

virtual void show() };

class test1_1:public test_bae //test_base的派生類

virtual void show() };

class test_2:public test1, public test1_1 //繼承自test1和test1_1

virtual void show() };

void main()

2,有虛繼承沒有分離show資料的mi

class test_bae   //基類 test_base

virtual void show() };

class test1:public virtual test_bae //test_base的派生類

virtual void show() };

class test1_1: virtual public test_bae //test_base的派生類

virtual void show() };

class test_2:public test1, public test1_1 //繼承自test1和test1_1

//這裡有變動,必須顯示的呼叫所有的基類的建構函式

virtual void show() };

void main()

3,使用了虛繼承的mi&分離了show資料

class test_bae   //基類 test_base

virtual void show()

protected:

virtual void date() const };

class test1:public virtual test_bae //test_base的派生類

virtual void show()

protected:

virtual void date() const };

class test1_1: virtual public test_bae //test_base的派生類

virtual void show()

protected:

virtual void date() const };

class test_2:public test1, public test1_1 //繼承自test1和test1_1

//這裡有變動,必須顯示的呼叫所有的基類的建構函式

virtual void show()

protected:

virtual void date() const };

void main()

/*總結:

多重繼承(mi) 必須使用虛繼承,不然會出現多個基類;

虛繼承中基類的建構函式 必須顯示的呼叫;

考慮某些函式子類的函式與父類的函式衝重複的情況 比如前面的 show 函式,所以必須將重複去掉 分離某些資料(較好的方法用protected繼承)

*/

C 多重繼承 虛繼承

c 中的多繼承,建構函式處理並沒有問題,物件構造的時候按照繼承中宣告的順序呼叫多個父類的建構函式,析構函式同樣遵守單繼承中的原則。二意性問題 如果多基類中存在同名成員,會產生二意性的問題 比如,root1類中宣告doany 介面,root2類中也宣告了doany 介面,child多承繼root1和r...

c 多重繼承 虛繼承 菱形繼承

多重繼承的特性和使用和單繼承沒區別。按照單繼承來使用即可。多重繼承可能會引入乙個 菱形繼承的問題 這個問題其實並不算問題,因為它合情合理,即多個基類 擁有乙個共同的基類,那麼在構造的時候,由於構造的遞迴特性,就會出現共同基類出現兩份例項的 情況,而且如果針對性修改,那麼如果不在訪問共同基類的時候先指...

C 多重繼承與虛繼承

在派生類中對基類成員的訪問應該是唯一的。但是,在多繼承情況下,可能造成對基類中某個成員的訪問出現了不一致的情況,這時就稱對基類成員的訪問產生了二義性。派生類在訪問基類成員函式時,由於基類存在同名的成員函式,導致無法確定訪問的是哪個基類的成員函式,因此出現了二義性錯誤。例如 includeusing ...