c 之多繼承及菱形繼承

2021-10-13 17:32:15 字數 885 閱讀 5618

c++允許乙個類繼承多個類,但在實際開發中並不建議去使用,可能會引發一些錯誤難以發現,比如菱形繼承

語法:class 子類 : 繼承方式 父類1 , 繼承方式 父類2 .

多繼承語法可能會引發父類中同名成員出現,子類使用時需要加作用域區分

菱形繼承的概念:

兩個派生類繼承同乙個基類

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

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

問題

兩個子類同時繼承了父類的資料,當子類的子類使用資料時就會產生二義性  這是需要加作用域

子類的子類,同時繼承了兩個子類的資料,但是這份資料應只有乙份

解決

虛繼承:利用虛繼承可以解決菱形繼承的問題 繼承之前加上關鍵字virtual,此時的父類稱虛基類

虛繼承之後,此時的兩個子類實際上儲存著乙個指標,而指標指向乙個表,表中記錄了偏移量,加上偏移位址即可找到所要的資料,也就是此時的只有乙份資料

測試

#includeusing namespace std;

//父類

class base

;//子類1

class son1:virtual public base

;//子類2

class son2 :virtual public base

;//子類的子類

class grandson : public son1, public son2

;void test()

int main()

複雜的菱形繼承及菱形虛擬繼承

乙個子類只有乙個直接父類時稱這個繼承關係為單繼承 乙個子類有兩個或兩個以上的直接父類時稱這個繼承方式為多繼承 菱形繼承是多繼承的一種特殊情況 菱形繼承的問題 1.冗餘 2.二義性 class person class student public person class teacher publi...

c 繼承 二 菱形繼承

在c 一 中,寫的程式是單繼承 即乙個子類只有乙個父類 下面將寫乙個多繼承程式 即乙個子類有兩個或兩個以上的父類 多繼承是c 的乙個缺陷 對上述 直接進行編譯會產生問題,問題在於dd.fun 編譯器報錯很明確,它不知道這裡的fun函式是要訪問b中的還是c中的。解決這個問題有兩種方案,第一種是重寫,即...

菱形繼承 菱形虛擬繼承

菱形繼承 鑽石繼承 模型 拿如下 舉例 class person class student public person class teacher public person class graduate public student,public teacher void test 當派生類gr...