物件(
object
)是類(
class
)的乙個例項(
instance
)。如果將物件比作房子,那麼類就是房子的設計圖紙。所以物件導向設計的重點是類的設計,而不是對 象的設計。
對於c++程式而言,設計孤立的類是比較容易的,難的是正確設計基類及其派生類。 本章僅僅論述「繼承」(
inheritance
)和「組合」(
composition
)的概念。
注意,當前物件導向技 術的應用熱點是
com和corba
, 這些內容超出了
c++教材的範疇,請閱讀
com和
corba
相關論著。
powered by gisun
繼承 如果
a是基類,b是
a的派生類,那麼
b將繼承
a 的資料和函式。 例 如:
class a
;class b : public a
;main()
這個簡單的示例程式說明了乙個事實:
c++ 的「繼承」特性可以提 高程式的可復用性。 正因為「繼承」太有用、太容易用,才要防止亂用「繼承」。我們應當給「繼承」立一些使用規則。
【規則
10-1-1】如果類a和類
b毫不相關,不可以為了使
b的功能更多些而讓b繼承
a 的功能和屬性。 不 要覺得「白吃白不吃」,讓乙個好端端的健壯青年無緣無故地吃人參補身體。
【規則
10-1-2】若在邏輯上b是
a的「一種」(
),則允許b繼承
a 的功能和屬性。 例 如男人(
man) 是人(
human
) 的一種,男孩(
boy)是男人的一種。那麼類
man可以從類
human
派生,類
boy可以從類
man派生。
class human
;class man : public human
;class boy : public man
;注意事項
【規則
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的功能和屬性。
組合【規則
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、、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...