C++ 各种继承

这篇文章对继承的举例非常好:

公有继承、私有继承、保护继承的区别

下面通过一个示例来介绍三种继承的区别。
定义一个基类(假设为一个快退休的富豪):

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继承意味着只有实现部分被继承,接口部分应略去。

继承总结

类的继承可以分为两个部分:

  1. 子类可以继承父类什么(可以访问父类什么)
  2. 子类以什么方式继承父类的那些可以访问的东西

对于第一点,子类可以访问父类的public和protected成员,private不可以
对于第二点,评级private>protected>public。

因此可以得到下表:

子类继承方式 \ 父类属性publicprotectedprivate
publicpublicprotected/
protectedprotectedprotected/
privateprivateprivate/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值