• 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继承在软件 “设计” 层面没有意义,其意义只及于软件实现层面。
  • 相关阅读:
    JAVA中final关键字的作用
    JAVA作用域和排序算法介绍
    JAVA的控制结构
    Java概述
    P6329 【模板】点分树 | 震波[点分树]
    BZOJ #4771. 七彩树 [主席树,链并,差分]
    CF1276F Asterisk Substrings [后缀自动机]
    P4173 残缺的字符串 [FFT]
    CF528D Fuzzy Search [FFT]
    #4589. Hard Nim [FWT]
  • 原文地址:https://www.cnblogs.com/ktao/p/8579115.html
Copyright © 2020-2023  润新知