b和c都單繼承了a
d繼承了b和c 是多繼承 有兩個或兩個以上的基類就是多繼承
class a
public:
int ma;
};class b : public a
public:
int mb;
};class c : public a
public:
int mc;
};class d : public b, public c
public:
int md;
};
菱形繼承造成的問題:就是d中有兩份a中的資料ma 就是所謂的二義性 編譯都通不過
為了解決這個問題 可以用虛繼承來解決
虛繼承的原則就是:誰從a直接繼承 就讓誰虛繼承a
b和c虛繼承a
class a
virtual void show()
public:
int ma;
};class b : virtual public a
public:
int mb;
};class c : virtual public a
public:
int mc;
};class d : public b, public c
public:
int md;
};
b、c都從a虛繼承 此時a成為虛基類 這樣就可以解決d中有兩份a資料的問題 解決了二義性的問題 繼承(單繼承 多繼承 菱形繼承 虛繼承)
一 單繼承 單繼承是一種 乙個子類只有乙個直接父類 的繼承關係。二 多繼承 多繼承是一種 乙個子類有兩個或兩個以上直接父類 的繼承關係。三 菱形繼承 菱形繼承由兩個 或以上 單繼承,乙個多繼承構成,結構如下 顯然,上例中assistant類多繼承了student和teacher兩個類,而studen...
C 繼承6 虛繼承 菱形繼承
建立 1.farmer類,資料成員 m strname,成員函式 構造 析構 sow 2.worker類,資料成員 m strcode,成員函式 構造 析構 carry 3.migrantworker類,資料成員 無,成員函式 構造 析構 4.person類,資料成員 m strcolor,成員函式...
c 多重繼承 虛繼承 菱形繼承
多重繼承的特性和使用和單繼承沒區別。按照單繼承來使用即可。多重繼承可能會引入乙個 菱形繼承的問題 這個問題其實並不算問題,因為它合情合理,即多個基類 擁有乙個共同的基類,那麼在構造的時候,由於構造的遞迴特性,就會出現共同基類出現兩份例項的 情況,而且如果針對性修改,那麼如果不在訪問共同基類的時候先指...