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