博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
保护继承和私有继承
阅读量:5292 次
发布时间:2019-06-14

本文共 2267 字,大约阅读时间需要 7 分钟。

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

   

   

   

   

   

   

   

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

   

   

   

   

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

里面的 公有继承

 

 

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

   

   

   

   

公有继承:

   

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】

转载于:https://www.cnblogs.com/siwuxie095/p/6801905.html

你可能感兴趣的文章
字符串元转分
查看>>
thinkphp 防sql注入
查看>>
201521123044 《Java程序设计》第1周学习总结
查看>>
MIT Scheme 的基本使用
查看>>
程序员的“机械同感”
查看>>
在16aspx.com上下了一个简单商品房销售系统源码,怎么修改它的默认登录名和密码...
查看>>
c++回调函数
查看>>
linux下Rtree的安装
查看>>
【Java】 剑指offer(53-2) 0到n-1中缺失的数字
查看>>
Delphi中ListView类的用法
查看>>
bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】
查看>>
[原创]Java 的传值小例子
查看>>
【MySQL学习】安装和配置 服务无法启动 没有报告任何错误
查看>>
C# 修饰符
查看>>
JavaScript启示录
查看>>
我需要什么样的浏览器?
查看>>
取textaera里的值
查看>>
java设计模式1--工厂方法模式(Factory Method)
查看>>
博客第一弹—聊聊HTML的那些事
查看>>
上海2017QCon个人分享总结
查看>>