zoukankan      html  css  js  c++  java
  • C++ 中私有继承、保护继承与公有继承

    区别

    下面通过一个示例来介绍三种继承的区别。

    定义一个基类(假设为一个快退休的富豪):

    class RichMan
    {
    public:
        RichMan();
        ~RichMan();
        int m_company;    
    private:
        int m_money;
        int m_car;
    protected:
        int m_house;
        
    };
    • 公司是public的,那么他自己(基类),创业伙伴(友元),儿子(子类),其他人(外部)都可以访问。
    • 钱和车子是private的,自己(基类),创业伙伴(友元)可以访问。儿子(子类)和外人都不给开。
    • 房子是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)继承:

    2.私有继承:private

    class LittleRichMan :
        private RichMan
    {
    public:
        LittleRichMan();
        ~LittleRichMan();
    private:
        int m_company;//仿佛
        int m_house;//仿佛
    };

    可以想象他的儿子是个自私的人,通过private的方式继承:public和protected变成了private。

    自己占用了公司和房子,这样除了自己和友元,任何方式都不得访问。

    最后,protected继承:

    保护继承:protected

    class LittleRichMan :
        private RichMan
    {
    public:
        LittleRichMan();
        ~LittleRichMan();
    protected:
        int m_company;//仿佛
        int m_house;//仿佛
    };

    原先的public变成了protected,protected保持不变。这样,公司和房子是除了外人不可以访问,自己,友元,子类都可以访问。

    谨慎使用private继承

    在C++中。公有继承强调的是 “is-a” 的关系,即一个派生类可以当成一个基类来看待,属于同一类。例如:男人(子类)/女人(子类)都是人(父类)。

    对于private继承而言,并不存在这样一种关系,为什么?

    在private继承中,父类所有的成员在子类继承后都会变成private(私有)属性,纵使它们在父类中原本是protected或public属性。

    采用private继承的意义

    •   Private继承意味着implement-in-terms-of(根据某物实现出)。若你让class D以private继承class B,你的用意是为了采用class B内已经备妥的某些特性,不是因为B对象和D对象存在有任何观念上的关系。
    •   private继承纯粹是一种实现技术(这就是为什么继承自一个private base class的每样东西在你的class 内都是private的:因为它们都只是实现枝节而已)。
    •   private继承意味着只有实现部分被继承,接口部分应略去。
    •   如果D以privae继承B,意味着D对象根据B对象实现而得,再没有其他涵义了。
    •   Private继承在软件 “设计” 层面没有意义,其意义只及于软件实现层面。
  • 相关阅读:
    623. Add One Row to Tree 将一行添加到树中
    771. Jewels and Stones 珠宝和石头
    216. Combination Sum III 组合总数三
    384. Shuffle an Array 随机播放一个数组
    382. Linked List Random Node 链接列表随机节点
    向github项目push代码后,Jenkins实现其自动构建
    centos下安装Jenkins
    python提取批量文件内的指定内容
    批处理实现:批量为文件添加注释
    python抓取每期双色球中奖号码,用于分析
  • 原文地址:https://www.cnblogs.com/ktao/p/8579115.html
Copyright © 2011-2022 走看看