高品質C++編程指南學習筆記第10章—thanks to林銳

來源:互聯網
上載者:User

第十章     類的繼承和組合

10.1繼承

        
【規則10-1-1】若類A和類B毫不相關,不可為了使B的功能更多些而讓B繼承A的功能和屬性。

        
【規則10-1-2】若在邏輯上B是A的“一種”,並且A的所有功能和屬性對B而言都有意義,則允許B繼承A的功能和屬性。

10.2組合

        
【規則10-2-1】若在邏輯上A是B的“一部分”,則不允許B從A派生,而是要用A和其他東西組合成B。

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這些功能。樣本10-2-2十分簡短並且運行正確,但是這種設計方法卻是不對的。

//
功能正確並且代碼簡潔,但是設計方法不對。

class Head : public Eye, public Nose, public Mouth, public Ear

{

};

 

總結:簡而言之,A是B的子集,則繼承;A和B有交集,則組合。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.