下面经过一个示例来介绍三种继承的区别。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属性。