物件(
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...