《 高質量C 程式設計指南 》學習重點十

2021-04-30 17:55:39 字數 3350 閱讀 5358

物件(

object

)是類(

class

)的乙個例項(

instance

)。如果將物件比作房子,那麼類就是房子的設計圖紙。所以物件導向設計的重點是類的設計,而不是物件的設計。 對於

c++程式而言,設計孤立的類是比較容易的,難的是正確設計基類及其派生類。本章僅僅論述「繼承」(

inheritance

)和「組合」(

composition

)的概念。

注意,當前物件導向技術的應用熱點是

com和

corba

,這些內容超出了

c++教材的範疇,請閱讀

com和

corba

相關論著。

powered by gisun  http://www.gisun.com如果a

是基類,b是

a的派生類,那麼

b將繼承

a的資料和函式。例如:

class a ;

class b : public a ;

main()

這個簡單的示例程式說明了乙個事實:

c++的「繼承」特性可以提高程式的可復用性。正因為「繼承」太有用、太容易用,才要防止亂用「繼承」。我們應當給「繼承」立一些使用規則。

l【規則

10-1-1如果類a和類

b毫不相關,不可以為了使

b的功能更多些而讓b繼承

a的功能和屬性。不要覺得「白吃白不吃」,讓乙個好端端的健壯青年無緣無故地吃人參補身體。 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 ;

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

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 程式設計指南 》學習重點十

物件 object 是類 class 的乙個例項 instance 如果將物件比作房子,那麼類就是房子的設計圖紙。所以物件導向設計的重點是類的設計,而不是對 象的設計。對於c 程式而言,設計孤立的類是比較容易的,難的是正確設計基類及其派生類。本章僅僅論述 繼承 inheritance 和 組合 co...

高質量C 程式設計指南 》學習重點四

7 章 記憶體管理 記憶體分配方式有三種 從靜態儲存區域分配。內 存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例 如全域性變數,static 變數。在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單 元自動被釋放。棧記憶體分配運算內...

《 高質量C 程式設計指南 》學習重點六

有了 malloc free 為什麼還要 malloc與 free 是c c 語言的標準庫函式,new delete 是c 對於非內部資料型別的物件而言,光用 maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於 malloc fr...