C++中繼承與組合的區(qū)別詳細(xì)解析
C++的“繼承”特性可以提高程序的可復(fù)用性。正因?yàn)?ldquo;繼承”太有用、太容易用,才要防止亂用“繼承”。我們要給“繼承”立一些使用規(guī)則:
一、如果類A 和類B 毫不相關(guān),不可以為了使B 的功能更多些而讓B 繼承A 的功能。
不要覺(jué)得“不吃白不吃”,讓一個(gè)好端端的健壯青年無(wú)緣無(wú)故地吃人參補(bǔ)身體。
二、如果類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 應(yīng)該由類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);
};
// 正確的設(shè)計(jì),冗長(zhǎng)的程序
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 將自動(dòng)具有Look、Smell、Eat、Listen 這些功能:
// 錯(cuò)誤的設(shè)計(jì)
class Head : public Eye, public Nose, public Mouth, public Ear
{
};
上述程序十分簡(jiǎn)短并且運(yùn)行正確,但是這種設(shè)計(jì)卻是錯(cuò)誤的。這就開(kāi)頭所說(shuō)的很多程序員經(jīng)不起“繼承”而犯下設(shè)計(jì)錯(cuò)誤。
相關(guān)文章
C++11生成隨機(jī)數(shù)(random庫(kù))的使用
隨機(jī)數(shù)在很多地方都可以用到,本文主要介紹了C++11生成隨機(jī)數(shù)(random庫(kù))的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01使用c++實(shí)現(xiàn)OpenCV圖像橫向&縱向拼接
這篇文章主要介紹了使用c++實(shí)現(xiàn)OpenCV圖像橫向&縱向拼接,文中有圖像拼接函數(shù),可以實(shí)現(xiàn)如“長(zhǎng)圖拼接王”這類小程序的類似功能,大家可以將該函數(shù)封裝在軟件中自由使用2021-08-08一篇文章帶你實(shí)現(xiàn)C語(yǔ)言中常用庫(kù)函數(shù)的模擬
這篇文章主要介紹了C語(yǔ)言中常用庫(kù)函數(shù)的模擬,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Cocos2d-x UI開(kāi)發(fā)之CCControlSlider控件類使用實(shí)例
這篇文章主要介紹了Cocos2d-x UI開(kāi)發(fā)之CCControlSlider控件類使用實(shí)例,本文代碼中包含大量注釋講解了CCControlSlider控件類的使用,需要的朋友可以參考下2014-09-09C++哈希應(yīng)用之位圖,哈希切分與布隆過(guò)濾器詳解
這篇文章主要為大家詳細(xì)介紹了C++哈希應(yīng)用中的位圖、哈希切分與布隆過(guò)濾器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-04-04