公有继承

前面说过,派生类从基类继承时有三个步骤,
第一个步骤是吸收基类成员,吸收了基类中除构造函数和析构函数之外的所有数据成员和函数成员,

第二个步骤就是修改基类成员,包括修改对基类成员的访问属性和覆盖基类成员,

第三个步骤是添加新成员。

第二个步骤中修改对基类成员的访问属性可以通过派生类的继承方式控制。

类的成员有public(公有)、protected(保护)和private(私有)三种访问属性。

类的继承方式也有public(公有继承)、protected(保护继承)和private(私有继承)三种。

派生类通过不同的继承方式可以获得对基类成员的不同的访问属性。

派生类对基类成员的访问主要有两种,一种是派生类的新增成员对继承的基类成员的访问,另一种是派生类的对象对继承的基类成员的访问。

这里插一句本应属于“类成员的访问控制”中的话,通过对象访问类的成员属于外部访问,只能访问类的公有成员。

派生类的继承方式为public,即公有继承时,对基类中的公有成员和保护成员的访问属性都不变,而对基类的私有成员则不能访问。

具体说,就是基类的公有成员和保护成员被继承到派生类中以后同样成为派生类的公有成员和保护成员,派生类中新增成员对他们可以直接访问,派生类的对象只能访问继承的基类公有成员。但是派生类的新增成员和派生类的对象都不能访问基类的私有成员。

给大家写一个公有继承的简单例子:

#include <iostream>
using namespace std;
class Base            // 基类Base的声明
{public:               // 公有成员函数void SetTwo(int a, int b)  { x=a; y=b; }int GetX()   { return x; }int GetY()   { return y; }
private:              // 私有数据成员int x;int y;
};
class Child : public Base    // 派生类的声明,继承方式为公有继承
{public:                      // 新增公有成员函数void SetThree(int a, int b, int c)  { SetTwo(a, b); z=c; }int GetZ()   { return z; }
private:                     // 新增私有数据成员int z;
};
int main()
{Child child;           // 声明Child类的对象child.SetThree(1, 2, 3); // 设置派生类的数据cout << "The data of child:"<<endl;cout << child.GetX() << "," << child.GetY() << "," << child.GetZ() << endl;return 0;
}


上面的程序声明了一个基类Base,又声明了Base类的派生类Child,最后是主函数部分。

派生类Child从基类Base中继承了除构造函数和析构函数外的所有数据成员和函数成员,这些再加上派生类Child的新增成员就组成了Child类的全部。

类Child的继承方式为公有继承,基类Base的所有公有成员在派生类Child中的访问属性不变,都可以直接访问,所以Child类的SetThree函数可以直接调用Base类的SetTwo函数。

基类公有成员SetTwo、GetX和GetY都变成了Child类外部接口的一部分。但是上面说过,派生类不能访问基类的私有成员,所以Child类不能访问Base类的x和y。

主函数中首先定义了派生类Child的对象child,然后通过对象child调用了派生类Child的新增公有函数SetThree和GetZ,还调用了从基类Base继承的公有成员函数GetX和GetY。

通过这个例子,派生类对基类成员的两种访问方式:派生类的新增成员对继承的基类成员的访问和通过派生类的对象对继承的基类成员的访问,都讲到了。

派生类对基类成员的访问控制之公有继承相关推荐

  1. 6-4 派生类使用基类的成员函数

    6-4 派生类使用基类的成员函数 分数 5 全屏浏览题目 切换布局 作者 李廷元 单位 中国民用航空飞行学院 按要求完成下面的程序: 1.定义一个Animal类,成员包括: (1)整数类型的私有数据成 ...

  2. 不同派生方式下基类成员在派生类中的可访问范围属性

    不同派生方式下基类成员在派生类中的可访问范围属性 派生方式 派生方式 派生方式 基类成员 公有派生 私有派生 保护派生 私有成员 不可访问 不可访问 不可访问 保护成员 保护 私有 保护 公有成员 公 ...

  3. C++ 类继承:构造函数与析构函数调用顺序,派生类和基类之间的特殊关系,公有继承及其他

    文章目录 一.派生类构造函数与基类构造函数 二.创建与销毁派生类对象时,构造函数和析构函数的调用 三.派生类和基类之间的特殊关系 四.公有继承 (一).何为公有继承 (二).多态公有继承 (三).虚函 ...

  4. 派生类到基类的转换 和基类到派生类的转换

    一. 基类与派生类的转换     3种继承方式(公用.保护.私有继承)中,公用派生类才是基类真正的子类型,它完整地继承了基类的功能.     不同类型数据之间在一定条件下可以进行类型的转换.基类与派生 ...

  5. 【C++ Priemr | 15】派生类向基类转换的可访问性

    1. 只有当D公有继承B时,用户代码才能使用派生类向基类的转换:如果D私有继承B的方式是受保护的或者私有的,则用户代码不能使用该转换. class A {}: class B : public A { ...

  6. 派生类从基类继承的过程

    派生类从基类继承的过程 派生类从基类继承的过程可以分为三个步骤:吸收基类成员.修改基类成员和添加新成员. 吸收基类成员就是代码复用的过程,修改基类成员和添加新成员实现的是对原有代码的扩展,而代码的复用 ...

  7. C++学习记录:派生类向基类转换及其可访问性

    知乎有很多博主学不会了一言不合就抄书,我觉得这对学习计算机科学是一样的. 这里说一个自己或许也有许多人都会也不太注意的点,派生类向基类转换及其可访问性,抄自<C++ Primer>. 派生 ...

  8. 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

    一.不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初 ...

  9. C++ 多继承类 虚基类

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/jzj_c_love/article/d ...

最新文章

  1. R语言基于线性回归(Linear Regression)进行特征筛选(feature selection)
  2. 万豪酒店数据库遭入侵 5亿顾客信息或泄露
  3. 活动推荐|20位大咖齐聚,“中国首届沉浸产业发展论坛”10月底将于南京召开...
  4. 一个极好的ALV例子
  5. 【CyberSecurityLearning 47】PHP 数组
  6. 好的微服务架构=企业服务总线(ESB)的灭亡?
  7. SpringBoot项目利用maven自定义打包结构
  8. idea整合jboos_在 idea 中 启动 jboss 后, 没有运行部署(通过idea部署)的ssm项目,打开后项目404...
  9. 查看系统CPU是否支持KVM虚拟化(回显,shell脚本)
  10. 怎么把c语言改成汇编语言,如何把汇编语言转换成C语言
  11. ACM Robot Motion
  12. mysql 导出所有函数_mysql 导入导出 包括函数或者存储过程
  13. Linux命令行上传本地文件到服务器 、 下载服务器文件到本地
  14. nca算法_NCA告诉英国公民,立即寻找有史以来最恶劣的网络攻击的保护
  15. 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
  16. 计算机有两个桌面,你好,我的电脑有两个桌面怎么处理
  17. 区块链教程Fabric1.0源代码分析Ledger(账本)二
  18. 组合学:使用10个数字与52个字母生成1477万个不重复的4位串码V4衍生版本
  19. plsql相同变量高亮显示
  20. 室内监控与室外监控有什么区别 如何选择合适的监控摄像机

热门文章

  1. Spring-扫描/jar/读取Classpath下的文件资源
  2. 计算机系统-函数调用约定/调用规范/传参方式
  3. 小程序上传服务器图片压缩,微信小程序压缩图片并上传到服务器(拿去即用)...
  4. 《小米网抢购系统开发实践》读后感
  5. 理论篇-数理统计填坑篇
  6. 数据分析技术 使用SQL和EXCEL工具 第2版 pdf
  7. 房子过户给子女哪种方式最合适?买卖?赠与?继承?不看就亏大了!
  8. BZOJ 1019: [SHOI2008]汉诺塔( dp )
  9. 设计模式之“单例模式”
  10. WCF创建Rest服务(附:.net2.0创建Rest服务)