區別
下面通過一個示例來介紹三種繼承的區別。
定義一個基類(假設為一個快退休的富豪):
class RichMan { public: RichMan(); ~RichMan(); int m_company; private: int m_money; int m_car; protected: int m_house; };
- 公司是public的,那么他自己(基類),創業伙伴(友元),兒子(子類),其他人(外部)都可以訪問。
- 錢和車子是private的,自己(基類),創業伙伴(友元)可以訪問。兒子(子類)和外人都不給開。
- 房子是protected的,自己(基類),創業伙伴(友元)可以訪問,兒子(子類)也可以訪問,外人是不可以訪問。
如今他要退休,希望尋找繼承人。這里有三種繼承方式:
1.公有繼承:public
他的兒子繼承了他:LittleRichMan類
class LittleRichMan : public RichMan { public: LittleRichMan(); ~LittleRichMan(); };
經過public繼承后,LittleRichMan的成員訪問權限變成如下形式:
#include "RichMan.h" class LittleRichMan : public RichMan { public: LittleRichMan(); ~LittleRichMan(); int m_company;//仿佛 protected: int m_house;//仿佛 };
也就是說,public成員保持不變,private成員不可見,protected成員也保持不變。
他的兒子繼續開着公司,住着房子,但他爸爸的車子和錢是拿不到了。
繼續,若采用私有(private)繼承:
2.私有繼承:private
class LittleRichMan : private RichMan { public: LittleRichMan(); ~LittleRichMan(); private: int m_company;//仿佛 int m_house;//仿佛 };
可以想象他的兒子是個自私的人,通過private的方式繼承:public和protected變成了private。
自己占用了公司和房子,這樣除了自己和友元,任何方式都不得訪問。
最后,protected繼承:
保護繼承:protected
class LittleRichMan : private RichMan { public: LittleRichMan(); ~LittleRichMan(); protected: int m_company;//仿佛 int m_house;//仿佛 };
原先的public變成了protected,protected保持不變。這樣,公司和房子是除了外人不可以訪問,自己,友元,子類都可以訪問。
謹慎使用private繼承
在C++中。公有繼承強調的是 “is-a” 的關系,即一個派生類可以當成一個基類來看待,屬於同一類。例如:男人(子類)/女人(子類)都是人(父類)。
對於private繼承而言,並不存在這樣一種關系,為什么?
在private繼承中,父類所有的成員在子類繼承后都會變成private(私有)屬性,縱使它們在父類中原本是protected或public屬性。
采用private繼承的意義
- Private繼承意味着implement-in-terms-of(根據某物實現出)。若你讓class D以private繼承class B,你的用意是為了采用class B內已經備妥的某些特性,不是因為B對象和D對象存在有任何觀念上的關系。
- private繼承純粹是一種實現技術(這就是為什么繼承自一個private base class的每樣東西在你的class 內都是private的:因為它們都只是實現枝節而已)。
- private繼承意味着只有實現部分被繼承,接口部分應略去。
- 如果D以privae繼承B,意味着D對象根據B對象實現而得,再沒有其他涵義了。
- Private繼承在軟件 “設計” 層面沒有意義,其意義只及於軟件實現層面。
