昨天學習三種繼承方式,有些比喻十分形象,特此分享。學習
首先說明幾個術語:spa
1.基類設計
基類比起它的繼承類是個更加抽象的概念,所描述的範圍更大。因此能夠看到有些抽象類,他們設計出來就是做爲基類所存在的(有些名字裏面有abstract的)。code
基類也叫父類,雖然本人以爲這個比喻並不恰當。由於實際上子類是基類的擴充,描述了更加具體的東西。但現實的父子關係並不是如此。但在有些方面這個比喻仍是比較恰當的。blog
如今咱們假設基類是一個快要退休的富豪。代碼以下:繼承
class RichMan { public: RichMan(); ~RichMan(); int m_company; private: int m_money; int m_car; protected: int m_house; };
公司是public的,那麼他本身(基類),創業夥伴(友元),兒子(子類),其餘人(外部)均可以訪問。it
錢和車子是private的,本身(基類),創業夥伴(友元)能夠訪問。兒子和外人都不給開。class
房子是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繼承:
class LittleRichMan : private RichMan { public: LittleRichMan(); ~LittleRichMan(); private: int m_company;//彷彿 int m_house;//彷彿 };
能夠想象他的兒子是個自私的人,經過private的方式繼承:public和protected變成了private。
本身佔用了公司和房子,這樣除了本身和友元,任何方式都不得訪問。
最後,protected繼承:
class LittleRichMan : private RichMan { public: LittleRichMan(); ~LittleRichMan(); protected: int m_company;//彷彿 int m_house;//彷彿 };
原先的public變成了protected,protected保持不變。這樣,公司和房子是除了外人不能夠訪問,本身,友元,子類均可以訪問。