C 繼承與組合的區別

2021-09-17 02:31:48 字數 1987 閱讀 3360

1、繼承與組合

2、繼承和組合的使用場景

3、繼承和組合的區別

4、繼承和組合的優缺點

(1)繼承的優缺點

(2)組合的優缺點

c++程式開發中,設計孤立的模擬較容易,設計相互關聯的類卻比較難,這其中會涉及兩個概念,乙個是繼承(inheritance),乙個是組合(composition)。因為二者有一定的相似性,往往令程式設計師混淆不清。類的組合和繼承一樣,是軟體重用的重要方式。組合和繼承都是有效地利用已有類的資源。但二者的概念和用法不同。

繼承是物件導向三大基本特徵之一(繼承,封裝,多型),繼承就是子類繼承父類的特徵和行為,使得子類物件(例項)具有父類的例項域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。繼承強調的是is-a關係。在繼承中,父類的方法內部實現細節對子類可見,是『白盒式』的**復用。組合是通過對現有物件進行拼裝即組合產生新的具有更複雜的功能,組合體現的是整體和部分,強調的是has-a的關係。   

如果類a和類b毫不相關,不可以為了使b 的功能更多些而讓b 繼承a 的功能。不要覺得「不吃白不吃」,讓乙個好端端的健壯青年無緣無故地吃人參補身體。如果類b需要使用a的功能,則要分兩種情況考慮:

(1)若在邏輯上b 是a 的「一種」(a kind of),則允許b 繼承a 的功能。如男人(man)是人(human)的一種,男孩(boy)是男人的一種。那麼類man 可以從類human 派生,類boy 可以從類man 派生。示例程式如下:

class human

;class man : public human

;class boy : public man

;

(2)若在邏輯上a 是b 的「一部分」(a part of),則不允許b 繼承a 的功能,而是要用a和其它東西組合出b。例如眼(eye)、鼻(nose)、口(mouth)、耳(ear)是頭(head)的一部分,所以類head 應該由類eye、nose、mouth、ear 組合而成,不是派生而成。示例程式如下:

class eye

;class nose

;class mouth

;class ear

;// 正確的設計,冗長的程式

class head

void smell(void)

void eat(void)

void listen(void)

private:

eye m_eye;

nose m_nose;

mouth m_mouth;

ear m_ear;

};

如果允許head 從eye、nose、mouth、ear 派生而成,那麼head 將自動具有look、smell、eat、listen 這些功能:

// 錯誤的設計

class head : public eye, public nose, public mouth, public ear

;

上述程式十分簡短並且執行正確,但是這種設計卻是錯誤的。這就開頭所說的很多程式設計師經不起「繼承」的**而犯下設計錯誤。

繼承與組合都是物件導向中**復用的方式。在繼承中,父類的內部細節對子類可見,其**屬於白盒式的復用,而組合中,物件之間的內部細節不可見,其**屬於黑盒式復用。繼承在編碼過程中就要指定具體的父類,其關係在編譯期就確定,而組合的關係一般在執行時確定。繼承強調的是is-a的關係,而組合強調的是has-a的關係。

參考:

C 中繼承與組合的區別

物件和類是 c 中的重要內容,物件 object 是類 class 的乙個例項 instance 物件導向設計的重點是類的設計,而不是物件的設計。對於 c 程式而言,設計孤立的類是比較容易的,難的是正確設計基類及其派生類。這就和 繼承 inheritance 和 組合 composition 有重要...

C 中繼承與組合的區別

c 程式開發中,設計孤立的模擬較容易,設計相互關聯的類卻比較難,這其中會涉及到兩個概念,乙個是繼承 inheritance 乙個是組合 composition 因為二者有一定的相似性,往往令程式設計師混淆不清。類的組合和繼承一樣,是軟體重用的重要方式。組合和繼承都是有效地利用已有類的資源。但二者的概...

組合與繼承的區別

組合和繼承都允許在新的類中設定子物件,只是組合是顯式的,繼承是隱式的。繼承關係 is a 關係 組合關係 has a 關係 例如 car表示汽車物件,vehicle表示交通工具物件,tire表示輪胎物件 如何選擇 兩大原則 不要單純地為了實現 的重用而使用繼承,除非兩個類是 is a 的關係,否則不...