zoukankan      html  css  js  c++  java
  • (转)public、protect、private继承方式 C++

    C里面的结构体内的成员不受任何机制保护,直接能用,比如StructtypeA.x;StructtypeA.y;StructtypeA.fun();

    而c++则不同,c++的类像强化型的结构体

    public公有继承

    protected保护继承

    private私有继承

     

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

     

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

     

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

     

     

    私有继承时,基类的private成员仍为有私有.基类的publicprotected成员将变成派生类的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;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

     

     

     

     

     

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

    class E:public B

    {

    void SetTelNum(int nTelNum)

    { m_nTelNum=nTelNum;//可以 因为这是B的公有成员 } void SetAge(int nAge)

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

     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的保护成员,现成变成Eprotected成员 }

    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;//不可以 因为这是Dprivate成员,注意这里区别 }

    void SetAge(int nAge)

    { m_nAge=nAge;//不可以 因为这是Dprivate成员,注意区别 }

    void SetMoney(int nMoney)  

    public、protect、private继承方式 <wbr>C++

  • 相关阅读:
    【CFD之道】2018年原创文章汇总
    【OpenFOAM案例】03 Docker安装OpenFOAM
    【OpenFOAM案例】02 自己动手
    【OpenFOAM案例】01 elbow
    Fluent动网格【13】:网格光顺总结及实例
    Fluent动网格【12】:扩散光顺
    Fluent动网格【10】:区域运动案例
    Fluent动网格【11】:弹簧光顺
    happyChat开发系列:使用websocket.io实现双向通信的乐聊大前端开发
    vue,vuex的后台管理项目架子structure-admin,后端服务nodejs
  • 原文地址:https://www.cnblogs.com/encode/p/3704393.html
Copyright © 2011-2022 走看看