修練8年C 物件導向程式設計之體會2

2021-08-30 00:13:34 字數 1296 閱讀 7097

1.2 繼承與組合

如果a 是基類,b 是a 的派生類,那麼b 將繼承a 的資料和函式。示例程式如下:

class a

;class b : public a

;// example

main()

這個簡單的示例程式說明了乙個事實:c++的「繼承」特性可以提高程式的可復用性。正因為「繼承」太有用、太容易用,才要防止亂用「繼承」。我們要給「繼承」立一些使用規則:

不要覺得「不吃白不吃」,讓乙個好端端的健壯青年無緣無故地吃人參補身體。

二、如果類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

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

乙隻公雞使勁地追打乙隻剛下了蛋的母雞,你知道為什麼嗎?

因為母雞下了鴨蛋。

本書3.3 節講過「執行正確」的程式不見得就是高質量的程式,此處就是乙個例證。

修練8年C 物件導向程式設計之體會

在本頁瀏覽全文 1.3 虛函式與多型 除了繼承外,c 的另乙個優良特性是支援多型,即允許將派生類的物件當作基類的物件使用。如果a 是基類,b 和c 是a 的派生類,多態函式test 的引數是a 的 指標。那麼test 函式可以引用a b c 的物件。示例程式如下 class a void test ...

修練8年C 物件導向程式設計之體會

1.3 虛函式與多型 除了繼承外,c 的另乙個優良特性是支援多型,即允許將派生類的物件當作基類的物件使用。如果a 是基類,b 和c 是a 的派生類,多態函式test 的引數是a 的 指標。那麼test 函式可以引用a b c 的物件。示例程式如下 class a void test a a clas...

修練8年C 物件導向程式設計之體會

2 良好的程式設計風格 內功深厚的武林高手出招往往平淡無奇。同理,程式設計高手也不會用奇門怪招寫程式。良好的程式設計風格是產生高質量程式的前提。2.1 命名約定 有不少人程式設計時用拼音給函式或變數命名,這樣做並不能說明你很愛國,卻會讓用此程式的人迷糊 很多南方人不懂拼音,我就不懂 程式中的英文一般...