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 ...