下面經過一個示例來介紹三種繼承的區別。spa
定義一個基類(假設爲一個快退休的富豪):設計
class RichMan { public: RichMan(); ~RichMan(); int m_company; private: int m_money; int m_car; protected: int m_house; };
現在他要退休,但願尋找繼承人。這裏有三種繼承方式:code
他的兒子繼承了他:LittleRichMan類對象
class LittleRichMan : public RichMan { public: LittleRichMan(); ~LittleRichMan(); };
通過public繼承後,LittleRichMan的成員訪問權限變成以下形式:blog
#include "RichMan.h" class LittleRichMan : public RichMan { public: LittleRichMan(); ~LittleRichMan(); int m_company;//彷彿 protected: int m_house;//彷彿 };
也就是說,public成員保持不變,private成員不可見,protected成員也保持不變。繼承
他的兒子繼續開着公司,住着房子,但他爸爸的車子和錢是拿不到了。接口
繼續,若採用私有(private)繼承:it
class LittleRichMan : private RichMan { public: LittleRichMan(); ~LittleRichMan(); private: int m_company;//彷彿 int m_house;//彷彿 };
能夠想象他的兒子是個自私的人,經過private的方式繼承:public和protected變成了private。class
本身佔用了公司和房子,這樣除了本身和友元,任何方式都不得訪問。軟件
最後,protected繼承:
class LittleRichMan : private RichMan { public: LittleRichMan(); ~LittleRichMan(); protected: int m_company;//彷彿 int m_house;//彷彿 };
原先的public變成了protected,protected保持不變。這樣,公司和房子是除了外人不能夠訪問,本身,友元,子類均可以訪問。
在C++中。公有繼承強調的是 「is-a」 的關係,即一個派生類能夠當成一個基類來看待,屬於同一類。例如:男人(子類)/女人(子類)都是人(父類)。
對於private繼承而言,並不存在這樣一種關係,爲何?
在private繼承中,父類全部的成員在子類繼承後都會變成private(私有)屬性,縱使它們在父類中本來是protected或public屬性。