C++中繼承與組合的區(qū)別詳細解析
C++的“繼承”特性可以提高程序的可復用性。正因為“繼承”太有用、太容易用,才要防止亂用“繼承”。我們要給“繼承”立一些使用規(guī)則:
一、如果類A 和類B 毫不相關,不可以為了使B 的功能更多些而讓B 繼承A 的功能。
不要覺得“不吃白不吃”,讓一個好端端的健壯青年無緣無故地吃人參補身體。
二、如果類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
{
public:
void Look(void);
};
class Nose
{
public:
void Smell(void);
};
class Mouth
{
public:
void Eat(void);
};
class Ear
{
public:
void Listen(void);
};
// 正確的設計,冗長的程序
class Head
{
public:
void Look(void) { m_eye.Look(); }
void Smell(void) { m_nose.Smell(); }
void Eat(void) { m_mouth.Eat(); }
void Listen(void) { m_ear.Listen(); }
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
{
};
上述程序十分簡短并且運行正確,但是這種設計卻是錯誤的。這就開頭所說的很多程序員經不起“繼承”而犯下設計錯誤。
相關文章
一篇文章帶你實現(xiàn)C語言中常用庫函數(shù)的模擬
這篇文章主要介紹了C語言中常用庫函數(shù)的模擬,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09Cocos2d-x UI開發(fā)之CCControlSlider控件類使用實例
這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlSlider控件類使用實例,本文代碼中包含大量注釋講解了CCControlSlider控件類的使用,需要的朋友可以參考下2014-09-09