这篇文章对继承的举例非常好:
公有继承、私有继承、保护继承的区别
下面通过一个示例来介绍三种继承的区别。
定义一个基类(假设为一个快退休的富豪):
class RichMan
{
public:
RichMan();
~RichMan();
int m_company;
private:
int m_money;
int m_car;
protected:
int m_house;
};
- 公司是public的,那么他自己(基类),创业伙伴(友元),儿子(子类),其他人(外部)都可以访问。
- 钱和车子是private的,自己(基类),创业伙伴(友元)可以访问。儿子(子类)和外人都不给开。
- 房子是protected的,自己(基类),创业伙伴(友元)可以访问,儿子(子类)也可以访问,外人是不可以访问。
注: 父类成员的属性决定了子类在继承时是否可以访问,但与子类将这些继承的内容定义为什么属性无关。子类将其定义为什么属性,是由继承方式决定的。
如今他要退休,希望寻找继承人。这里有三种继承方式:
1 共有继承
他的儿子继承了他:LittleRichMan类:
(不同方式继承就是在类名后指定继承方式,后面将省略继承的实现过程,直接展示继承结果)
// 冒号后指定继承方式和继承类
class LittleRichMan : public RichMan
{
public:
LittleRichMan();
~LittleRichMan();
};
经过public继承后,LittleRichMan实际是这样的:
class LittleRichMan :
{
public:
LittleRichMan();
~LittleRichMan();
int m_company;//仿佛
protected:
int m_house;//仿佛
};
也就是说,公有继承,public、private成员保持不变,private成员不可见。
他的儿子继续开着公司,住着房子,但他爸爸的车子和钱是拿不到了。
2 私有继承
使用私有继承后,子类实际上是这样的:
class LittleRichMan :
{
public:
LittleRichMan();
~LittleRichMan();
private:
int m_company;//仿佛
int m_house;//仿佛
};
通过private的方式继承:public和protected变成了private。
可以想象他的儿子是个自私的人,自己占用了公司和房子,这样除了自己和友元,任何方式都不得访问。
3 保护继承
使用保护继承后,子类实际上是这样的:
class LittleRichMan :
{
public:
LittleRichMan();
~LittleRichMan();
protected:
int m_company;//仿佛
int m_house;//仿佛
};
原先的public变成了protected,protected保持不变。
这样,公司和房子是除了外人不可以访问,自己,友元,子类都可以访问。
私有继承的特殊含义
谨慎使用private继承。
在C++中。公有继承强调的是 “is-a” 的关系,即一个派生类可以当成一个基类来看待,属于同一类。例如:男人(子类)/女人(子类)都是人(父类)。
对于private继承而言,并不存在这样一种关系,为什么?
-
在private继承中,父类所有的成员在子类继承后都会变成private(私有)属性,纵使它们在父类中原本是protected或public属性。
-
Private继承意味着implement-in-terms-of(根据某物实现出)。若你让class D以private继承class B,你的用意是为了采用class B内已经备妥的某些特性,不是因为B对象和D对象存在有任何观念上的关系。
-
private继承纯粹是一种实现技术(这就是为什么继承自一个private base class的每样东西在你的class 内都是private的:因为它们都只是实现枝节而已)。
-
private继承意味着只有实现部分被继承,接口部分应略去。
继承总结
类的继承可以分为两个部分:
- 子类可以继承父类什么(可以访问父类什么)
- 子类以什么方式继承父类的那些可以访问的东西
对于第一点,子类可以访问父类的public和protected成员,private不可以
对于第二点,评级private>protected>public。
因此可以得到下表:
子类继承方式 \ 父类属性 | public | protected | private |
---|---|---|---|
public | public | protected | / |
protected | protected | protected | / |
private | private | private | / |