• 保护继承和私有继承


    -------------------siwuxie095

       

       

       

       

       

       

       

    在 C++ 中有三种继承方式:

       

       

       

       

    关于 公有继承,详见本人博客的分类:C++远征

    里面的 公有继承

    本人博客(任选一个)链接:

    https://www.baidu.com/s?ie=UTF-8&wd=siwuxie095

       

       

       

       

    公有继承:

       

    1)基类中 public 下的成员将被继承到派生类中 public 下

    2)基类中 protected 下的成员将被继承到派生类中 protected 下

    3)基类中 private 下的成员将被继承到派生类中不可见位置,但无法直接访问,

          没有被继承到派生类中 private 下

       

          

       

       

    保护继承:

       

    1)基类中 public 下的成员将被继承到派生类中 protected 下

    2)基类中 protected 下的成员也将被继承到派生类中 protected 下

    3)基类中 private 下的成员将被继承到派生类中不可见位置,但无法直接访问

       

       

       

    私有继承:

       

    1)基类中 public 下的成员将被继承到派生类中 private 下

    2)基类中 protected 下的成员也将被继承到派生类中 private 下

    3)基类中 private 下的成员将被继承到派生类中不可见位置,但无法直接访问

       

       

       

       

    在这三种继承关系中,以 私有继承-private 最为特殊

       

    为了说明这种特殊性,看如下实例:线段类与坐标类的关系

       

       

       

       

    可以看出,在线段类中有两个坐标类的对象:m_coorA 和 m_coorB

       

       

    在这种关系中,线段类只能访问到坐标类中的公有数据成员和公有成员

    函数

       

    而在私有继承中,子类对象也只能访问父类的公有数据成员和公有成员

    函数

       

       

    这两者是很相似的,在 C++ 中把线段和坐标的这种关系,称之为 has-a

    即 线段中有一个坐标,这种关系是一种包含关系,在私有继承中也是一种

    包含关系,当定义一个子类对象时,子类对象中就包含了一个父类的对象。

    因为它只能访问父类中公有的数据成员和成员函数,所以,从本质上来说,

    私有继承也是一种 has-a 的关系

       

       

       

       

       

       

    程序:

       

    Person.h:

       

    #include <string>

    using namespace std;

       

    class Person

    {

    public:

    Person();

    void play();

    protected:

    string m_strName;

    };

       

       

       

    Person.cpp:

       

    #include "Person.h"

    #include <iostream>

    using namespace std;

       

       

    Person::Person()

    {

    m_strName = "Merry";

    }

       

    void Person::play()

    {

    cout << "Person--play()" << endl;

    cout << m_strName << endl;

    }

       

       

       

    Soldier.h:

       

    #include "Person.h"

       

    class Soldier:protected Person//继承方式换为 private 后就不一样了

    {

    public:

    Soldier();

    void work();

    protected:

    int m_iAge;

    };

       

       

       

    Soldier.cpp:

       

    #include "Soldier.h"

    #include <iostream>

    using namespace std;

       

       

    Soldier::Soldier()

    {

       

    }

       

    void Soldier::work()

    {

    cout << "Soldier--work()" << endl;

    m_strName = "Jim";

    m_iAge = 20;

    cout << m_strName << "," << m_iAge << endl;

    }

       

       

       

    Infantry.h:

       

    #include "Soldier.h"

       

    class Infantry:public Soldier

    {

    public:

    void attack();

    };

       

       

       

    Infantry.cpp:

       

    #include "Infantry.h"

    #include <iostream>

    using namespace std;

       

       

    void Infantry::attack()

    {

    cout << "Infantry--attack()" << endl;

    //证明Soldier保护继承了Person后,Personpublic

    //protected 下的成员被继承到Soldierprotected

    m_strName = "James";

    m_iAge = 30;

    cout << m_strName << "," << m_iAge << endl;

    }

       

       

       

    main.cpp:

       

    #include <stdlib.h>

    #include "Infantry.h"

    using namespace std;

       

       

    int main(void)

    {

    Soldier soldier;

    //soldier.play(); //因为是保护继承所以无法被子类对象访问

    soldier.work();

    Infantry infantry;

    infantry.attack();

    system("pause");

    return 0;

    }

    //主要体会 Soldier.h 处的继承方式 protected private

       

       

       

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    秒杀项目之——通过令牌发放机制,控制秒杀大闸以及队列泄洪
    Guava的使用
    秒杀项目之细节随笔记录————
    redis搭建集群
    redis内存满了怎么办?
    多个电脑上免密登陆命令、scp远程拷贝、修改文件的用户和组
    克隆完虚拟机后修改网卡,修改静态IP
    redis基本操作和 过期时间设置以及持久化方案
    linux操作系统安装运行Redis
    云服务器以及linux操作系统打开防火墙,在墙上开一个小口
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6801905.html
Copyright © 2020-2023  润新知