菱形繼承和組合與繼承的選擇。

2021-09-13 12:26:33 字數 1061 閱讀 4300

class person

class student : public person

class teacher : public person

class assistant : public person,public student

void

test1()

由上述的**中可以看出,在給a._name初始化的時候,不確定訪問的是teacher中的_name,還是student中的_name。

為了解決二義性的問題,我們可以指定訪問父類的成員。

a.student:

:_name =

"xiaohua"

;a.teacher:

:_name =

"xiaohua"

;

但是,這種方法沒有辦法解決資料冗餘的問題,因此只能用虛擬繼承來實現(新增關鍵字virtual)。

class student : virtual public person

class teacher : virtual public person

其實,菱形虛擬繼承的原理是:通過了student和teacher的兩個指標指向的一張表。這兩個指標叫虛基表指標,這兩個表叫虛基表。續集表中存在偏移量,通過偏移量可以找到下面的_name。

繼承:class head : public eye

;組合:

class head

雖然繼承和組合都實現了復用,但是優先使用組合。

原因是:在繼承方式中,基類的內部細節對子類可見,一定程度上破壞了基類的封裝。派生類和基類之間的依賴關係很強,耦合度高;

而在組合中,物件內部的細節是不可見的。組合類之間沒有很強的依賴關係,耦合度低。

菱形繼承和菱形虛繼承

繼承是c 的一大特點,我們通過菱形繼承和菱形虛繼承對繼承進行進一步的分析。菱形繼承 建立乙個基類a讓b1和b2公有繼承於它,讓c公有繼承b1和b2。class a a int a class b1 public a b1 int b1 class b2 public a b2 int b2 clas...

菱形繼承與虛擬繼承

c 中的繼承有單繼承和多繼承 本文主要探索的是多繼承中菱形繼承的二義性和資料冗餘及解決方案 菱形繼承的物件模型 從記憶體看菱形繼承物件模型 用乙個簡易 的 來說明二義性和資料冗餘這個問題 class aa class bb public aa class cc public aa class dd ...

多繼承與菱形繼承

乙個派生類繼承了兩個或多個基類,這樣的繼承關係叫做多繼承。include using namespace std class b class b1 class d public b,public b1 int main 如上 派生類d以public許可權繼承了基類b和基類b1。構造函式呼叫 首先呼叫...