zoukankan      html  css  js  c++  java
  • c++中三种继承方式的区别

    public公有继承

    protected保护继承

    private私有继承

    我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用.

    公有继承时,基类的private成员派生类也不可用,基类的public和protected成员在派生类中可直接使用.继承过来(变成派生类相应的public和protected成员)只有public成员在派生类外可以直接使用.

    保护继承时,基类的private成员仍为有私有.基类的public和protected成员变成派生类的protected成员,这时在派生类外也不能直接使用原基类的public成员

    私有继承时,基类的private成员仍为有私有.基类的public和protected成员将变成派生类的private成员.

    举个例子.

    class A

    {

    public:

       int m_nTelNum;

    protected:

       int m_nAge;

    private:

       int m_nMoney;

    };

    class B:public A

    {

       void SetTelNum(int nTelNum)

       {

           m_nTelNum=nTelNum;

       }

       void SetAge(int nAge)

       {

           m_nAge=nAge;

       }

       void SetMoney(int nMoney)

       {

           m_nMoney=nMoney;//这里就出现错误,因为基类的private成员不能用.

       }

    };

    B objB;//创建B类的对象objB

    objB.m_nTelNum=123456;//可以

    objB.m_nAge=30;//错误.public继承中基类的protected在派生类中是protected

    objB.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

    class C:protected A

    {

       void SetTelNum(int nTelNum)

       {

           m_nTelNum=nTelNum;

       }

       void SetAge(int nAge)

       {

           m_nAge=nAge;

       }

       void SetMoney(int nMoney)

       {

           m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.

       }

    };

    C objC;//创建C类的对象objC

    objC.m_nTelNum=123456;//注意这里和public的区别,这里错误,m_nTelNum变成了C类的protected成员

    objC.m_nAge=30;//错误.protected继承中基类的protected在派生类中是protected,这与public同相

    objC.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

    class D:private A

    {

       void SetTelNum(int nTelNum)

       {

           m_nTelNum=nTelNum;

       }

       void SetAge(int nAge)

       {

           m_nAge=nAge;

       }

       void SetMoney(int nMoney)

       {

           m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.

       }

    };

    D objD;//创建D类的对象objD

    objD.m_nTelNum=123456;//错误,m_nTelNum变成了D类的private成员

    objD.m_nAge=30;//错误.private继承中基类的protected在派生类中是private

    objD.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

    从例子来看,三种继承从派生类内部引用来看好像没有区别,只在类外引用时表现不同.现在还看不出public和protected继承的区别

    那再看一个例子.

    class E:public B

    {

       void SetTelNum(int nTelNum)

       {

          m_nTelNum=nTelNum;//可以 因为这是B的公有成员

       }

       void SetAge(int nAge)

       {

          m_nAge=nAge;//可以 因为这是B的保护成员,现成变成E的protected成员

       }

       void SetMoney(int nMoney)

       {

          m_nMoney=nMoney;//这个肯定不可以!

       }

    };

    E objE;//

    objE.m_nTelNum=123456;//可以

    //其它的两个就不能用了.

    class F:public C

    {   

       void SetTelNum(int nTelNum)

       {

          m_nTelNum=nTelNum;//可以 因为这是C的保护成员,这里与public继承已经有区别但还没有表现出来

       }

       void SetAge(int nAge)

       {

          m_nAge=nAge;//可以 因为这是C的保护成员,现成变成E的protected成员

       }

       void SetMoney(int nMoney)

       {

          m_nMoney=nMoney;//这个肯定不可以!

       }

    };

    F objF;

    objF.m_nTel=123456;//错误,因为这是F的保护成员.注意与E类区别

    class G:public D

    {

       void SetTelNum(int nTelNum)

       {

          m_nTelNum=nTelNum;//不可以 因为这是D的private成员,注意这里区别

       }

       void SetAge(int nAge)

       {

          m_nAge=nAge;//不可以 因为这是D的private成员,注意区别

       }

       void SetMoney(int nMoney)

       {

          m_nMoney=nMoney;//这个肯定不可以!

       }

    };

    //那G在类外就没有了可以引用的继承过来成员了!

    //这些继承方式是很难理解的.最好的办法就是多写代码去试.

    c++中三种继承方式的区别

  • 相关阅读:
    ChaosBlade x SkyWalking 微服务高可用实践
    工商银行基于 Dubbo 构建金融微服务架构的实践-服务发现篇
    阿里 双11 同款流控降级组件 Sentinel Go 正式 GA,助力云原生服务稳稳稳
    我在阿里巴巴做 Serverless 云研发平台
    「更高更快更稳」,看阿里巴巴如何修炼容器服务「内外功」
    「云原生上云」后的聚石塔是如何应对 双11 下大规模应用挑战的
    从零入门 Serverless | SAE 的远程调试和云端联调
    利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题
    Arthas 实践——生产环境排查 CPU 飚高问题
    RocketMQ 很慢?引出了一个未解之谜
  • 原文地址:https://www.cnblogs.com/tankeee/p/3957568.html
Copyright © 2011-2022 走看看