zoukankan      html  css  js  c++  java
  • 保护继承和私有继承

    -------------------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】

  • 相关阅读:
    小数据池,bytes
    不会的知识总结:
    nginx低版本不支持pathinfo模式,thinkphp针对此问题的解决办法
    备份了一个nginx的虚拟主机配置文件报错
    centos修改ssh端口
    CentOS安装配置Git服务器(gitosis)
    干货CentOS6.5_Nginx1.40_Php5.57_MySQL5.5.35编译安装全记录
    编译升级php
    php源代码安装常见错误与解决办法分享
    兼容IE,Firefox,Opera等浏览器的添加到收藏夹js代码实现
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6801905.html
Copyright © 2011-2022 走看看