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

2021-09-13 10:53:41 字數 1502 閱讀 7586

乙個子類只有乙個直接父類時稱這個繼承關係為單繼承

乙個子類有兩個或兩個以上的直接父類時稱這個繼承方式為多繼承

菱形繼承是多繼承的一種特殊情況

菱形繼承的問題

1.冗餘

2.二義性

class person

;class student : public person

;class teacher : public person

;class assistant : public student, public teacher

;void test ()

解決方法(虛擬繼承)

// class b : public a 

class b : virtual public a

;// class c : public a

class c : virtual public a

;class d : public b, public c

;int main()

很多人說c++語法複雜,其實多繼承就是乙個體現。有了多繼承,就存在菱形繼承,有了菱形繼承就有 菱形虛擬繼承,底層實現就很複雜。

多繼承可以認為是c++的缺陷之一。

繼承和組合

(1)public繼承是一種is-a的關係。也就是說每個派生類物件都是乙個基類物件。

(2)組合是一種has-a的關係。假設b組合了a,每個b物件中都有乙個a物件。

(3)有限使用物件組合,而不是類繼承

(4)繼承允許你根據基類類的實現來定義派生類的實現。這種通過生成派生類的復用通常被稱為白箱復 用(white-box reuse)。術語「白箱」是相對可視性而言:在繼承方式中,基類的內部細節對子類可見 。繼承一定程度破壞了基類的封裝,基類的改變,對派生類類有很大的影響。派生類和基類間的依賴關係很強,耦合度高。

(5) 物件組合是類繼承之外的另一種復用選擇。新的更複雜的功能可以通過組裝或組合物件來獲得。對 象組合要求被組合的物件具有良好定義的介面。這種復用風格被稱為黑箱復用(black-box reuse), 因為物件的內部細節是不可見的。物件只以「黑箱」的形式出現。 組合類之間沒有很強的依賴關係, 耦合度低。優先使用物件組合有助於你保持每個類被封裝。

(6)實際盡量多去用組合。組合的耦合度低,**維護性好。不過繼承也有用武之地的,有些關係就適 合繼承那就用繼承,另外要實現多型,也必須要繼承。類之間的關係可以用繼承,可以用組合,就 用組合。

菱形繼承 菱形虛擬繼承

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

菱形虛擬繼承

菱形繼承在c 繼承中是一種複雜的繼承關係,存在著二義性和資料冗餘的問題,而菱形虛擬繼承則是為了解決菱形繼承所存在的問題。為了 菱形虛擬繼承如何解決該問題,我先建立個乙個較為簡單的菱形繼承模型。下面分別是菱形繼承和菱形虛擬繼承的 實現 菱形繼承 include includeusing namespa...

擁有虛函式覆蓋的菱形繼承及菱形虛擬繼承

在之前的部落格中有簡單的介紹了一下 沒有虛函式的菱形繼承。此篇部落格將對菱形繼承進行公升級,介紹有虛函式的菱形繼承。舉乙個簡單的例子 includeusing namespace std class aa virtual void fun2 virtual void fun3 protected i...