高質量C C程式設計指南 類的繼承與組合

2021-08-23 13:57:48 字數 2200 閱讀 2226

物件(object)是類(class)的乙個例項(instance)。如果將物件比作房子,那麼類就是房子的設計圖紙。所以物件導向設計的重點是類的設計,而不是物件的設計。

對於c++程式而言,設計孤立的類是比較容易的,難的是正確設計基類及其派生類。本章僅僅論述「繼承」(inheritance)和「組合」(composition)的概念。

10.1 繼承

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

class a

public:

void func1(void);

void func2(void);

class b : public a

public:

void func3(void);

void func4(void);

main()

b b;

b.func1(); // b從a繼承了函式func1

b.func2(); // b從a繼承了函式func2

b.func3();

b.func4();

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

l 【規則10-1-2】若在邏輯上b是a的「一種」(a kind of ),則允許b繼承a的功能和屬性。例如男人(man)是人(human)的一種,男孩(boy)是男人的一種。那麼類man可以從類human派生,類boy可以從類man派生。

class human

class man : public human

class boy : public man

u 注意事項

【規則10-1-2】看起來很簡單,但是實際應用時可能會有意外,繼承的概念在程式世界與現實世界並不完全相同。

例如從生物學角度講,鴕鳥(ostrich)是鳥(bird)的一種,按理說類ostrich應該可以從類bird派生。但是鴕鳥不能飛,那麼ostrich::fly是什麼東西?

class bird

public:

virtual void fly(void);

class ostrich : public bird

例如從數學角度講,圓(circle)是一種特殊的橢圓(ellipse),按理說類circle應該可以從類ellipse派生。但是橢圓有長軸和短軸,如果圓繼承了橢圓的長軸和短軸,豈非畫蛇添足?

所以更加嚴格的繼承規則應當是:若在邏輯上b是a的「一種」,並且a的所有功能和屬性對b而言都有意義,則允許b繼承a的功能和屬性。

組合l 【規則10-2-1】若在邏輯上a是b的「一部分」(a part of),則不允許b從a派生,而是要用a和其它東西組合出b。

例如眼(eye)、鼻(nose)、口(mouth)、耳(ear)是頭(head)的一部分,所以類head應該由類eye、nose、mouth、ear組合而成,不是派生而成。如示例10-2-1所示。

class eye

;class nose

;class mouth

;class ear

;// 正確的設計,雖然**冗長。

class head

public:

void look(void)

void smell(void)

void eat(void)

void listen(void)

private:

eye m_eye;

nose m_nose;

mouth m_mouth;

ear m_ear;

示例10-2-1 head由eye、nose、mouth、ear組合而成

如果允許head從eye、nose、mouth、ear派生而成,那麼head將自動具有look、 smell、eat、listen這些功能。示例10-2-2十分簡短並且執行正確,但是這種設計方法卻是不對的。

// 功能正確並且**簡潔,但是設計方法不對。

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

示例10-2-2 head從eye、nose、mouth、ear派生而成

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

因為母雞下了鴨蛋。

很多程式設計師經不起「繼承」的**而犯下設計錯誤。「執行正確」的程式不見得是高質量的程式,此處就是乙個例證。

高質量C C程式設計指南

1.如果引數是指標,且僅作輸入用,則應在型別前加const,以防止該指標在函式體內被意外修改 2.在函式體的 入口處 對引數的有效性進行檢查 在函式體的 出口處 對return語句的正確性和效率進行檢查 3.引用的一些規則如下 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能...

高質量C C程式設計指南

目錄 前 言.6 第1章檔案結構 11 1.1 版權和版本的宣告 11 1.2 標頭檔案的結構 12 1.3 定義檔案的結構 13 1.4 標頭檔案的作用 13 1.5 目錄結構 14 第2章程式的版式 15 2.1 空行.15 2.2 行.16 2.3 行內的空格 17 2.4 對齊.18 2.5...

高質量C C程式設計指南 5

第5章常量 常量是一種識別符號,它的值在執行期間恆定不變。c語言用 define來定義 常量 稱 為巨集常量 c 語言除了 define外還可以用 const來定義 常量 稱 為const 常量 5.1為什麼需要常量 如果不使用常量,直接在程式中填寫數字或字串,將會有什麼麻煩?1 程式的可 讀性 可...