




免费预览已结束
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验 7 继承 派生 编程的目的是描述现实问题病寻求其解决方案 而现实世界中存在着大量的继承关系 这就要求程序中也要能够如实地描述这种继承关系 本章主要讲述 C 中的继承机制 1 继承与派生 目的 继承和派生的目的是保持已有类的特性并构造新类 二者的意思实质上相同 只是着眼 点不同 继承强调保持已有类的特性 派生类强调在已有类的基础上新增自己的特性 被继承的类被称为基类 父类 超类 派生出的新类被称为派生类 子类 继承可以 实现代码的重用和扩展 派生主要是当新问题出现 原程序无法解决时 需要对原有程序进 行改造 派生类的声明 class 派生类名 继承方式 基类名 派生类成员的声明 2 继承方式 继承基类时有 3 种继承方式 公有继承 public 特点 派生类中的成员函数可以直接访问基类中的 public 和 protected 成员 但不 能访问基类的 private 成员 派生类对象除了能访问派生类的 public成员外 还能访问基类的 public成员 保护成员兼顾了代码的重用和细节的隐藏 例 1 公有继承 include using namespace std class Base int x y 私有数据成员 protected int a b 保护数据成员 public int m n 公有数据成员 void SetX int X 为私有数据成员设置接口 x X void SetY int Y 为私有数据成员设置接口 y Y int GetX 为私有数据成员设置接口 return x int GetY 为私有数据成员设置接口 return y class Derived public Base 以公有方式继承基类 public void SetXY int X int Y 语句 1 使用基类接口函数设置数据 SetX X SetY Y void SetAB int A int B 派生类可以直接访问基类的保护数据 a A b B void SetMN int M int N 派生类可以直接访问基类的公有数据 m M n N int GetSumXY 语句 2 使用基类接口函数提取数据 return GetX GetY 派生类可以直接访问基类的保护数据 int GetSumAB return a b int GetSumMN 派生类可以直接访问基类的公有数据 return m n int main Derived objD objD SetXY 1 2 objD SetAB 10 20 objD SetMN 100 200 cout M N objD m objD n endl 派生类对象可以直接访问公有数据 cout X Y objD x objD y endl 派生类对象不能直接访问私有数据 cout X Y objD GetX objD GetY endl cout A B objD a objD b endl 派生类对象不能直接访问保护数据 cout A B objD GetSumAB endl return 0 私有继承 private 特点 派生类中的成员函数可以直接访问基类中的 public 和 protected 成员 但不 能访问基类的 private 成员 这一点和公有继承相同这一点和公有继承相同 派生类对象只能访问派生类的 public 成员外 不能访问基类的任何成员 例 2 私有继承 把例 1 中的公有继承改为私有继承 class Derived private Base 以私有方式继承基类 其他的不变 请读者自己分析 其他的不变 请读者自己分析 保护继承 protected 特点 与 private 方式相同 派生类中的成员函数可以直接访问基类中的 public 和 protected 成员 但不 能访问基类的 private 成员 与公有继承和私有继承相同与公有继承和私有继承相同 派生类对象只能访问派生类的 public 成员外 不能访问基类的任何成员 与 私有继承相同 与 私有继承相同 例 3 保护继承 把例 1 中的公有继承改为私有继承 class Derived protected Base 以保护方式继承基类 其他的不变 请读者自己分析 其他的不变 请读者自己分析 3 类的兼容规则 类的兼容规则是指在需要基类对象的任何地方 都可以用公有派生类的对象来代替 反 之 不成立 即不能用基类对象代替公有派生类的对象 这是因为 公有派生类对象包含了 基类的全部成员 但公有派生类对象还有自己新增的对象 所以包含的信息量更多 具体规 则 派生类的对象可以被赋值给基类对象 派生类对象可以初始化基类对象 指向基类的指针可以指向派生类对象 为了实现多态性 4 继承时的构造函数 基类的构造函数不被继承 派生类中需要声明自己的构造函数 派生类的构造函数需要 给基类的构造函数传递参数 单一继承时的构造函数 请参考 case07 7 7 cpp 派生类名 派生类名 基类所需的形参 本类成员所需的形参 基类名 参数表 本类成员初始化赋值语句 多继承时的构造函数 请参考 case07 7 8 cpp 派生类名 派生类名 基类 1 的形参 基类 2 的形参 基类 n 的形参 本类的形参 基类名 1 参数 基类名 2 参数 基类名 n 参数 本类成员初始化赋值语句 多继承且有内嵌对象时的构造函数 请参考 case07 7 9 cpp 7 10 cpp 7 11 cpp 派生类名 派生类名 基类 1 的形参 基类 2 的形参 基类 n 的形参 本类形参 基类名 1 参数 基类名 2 参数 基类名 n 参数 对象数据成员的初始化 本类成员初始化赋值语句 调用次序 1 调用基类构造函数 调用顺序按照它们被继承时声明的顺序 从左向右 2 调用成员对象的构造函数 调用顺序按照它们在类中声明的顺序 3 派生类的构造函数体中的内容 5 继承时的拷贝构造函数 基类的拷贝构造函数也不被继承 派生类中需要声明自己的拷贝构造函数 派生类的拷 贝构造函数需要给基类的拷贝构造函数传递参数 派生类名 派生类名 派生类 请参考 case07 7 12 cpp 7 13 cpp 6 继承时的析构函数 在派生过程中 基类的析构函数也不能继承 如果需要析构的话 就要在派生类中声明 新的析构函数 派生类析构函数的声明与没有继承关系的类中析构函数的声明方法完全相同 派生类的析构函数的主要功能是清理本类中开辟的空间 如果基类也需要清理基类中开 辟的空间 则派生类的析构函数需要调用基类的析构函数 当有多继承 含有嵌入对象时 他们的析构函数的执行顺序和他们的构造函数的执行顺 序严格相反 请参考 case07 7 8 cpp 7 9 cpp 7 10 cpp 7 11 cpp 7 12 cpp 7 13 cpp 7 派生类成员的标识与访问 前面讲过隐藏规则 其中有一条 如果存在两个或多个具有包含关系的作用域 外层声 明了一个标识符 而内层没有声明同名的标识符 那么外层的标识符在内层可见 如果在内 层声明了同名标识符 则外层标识符在内层不可见 与此类似 在类的派生层次结构中 基类和派生类的成员都具有类作用域 他们的关系 相当于包含与被包含的关系 基类在外层 派生类在内层 具体来说 如果派生类中声明了一个和其某个基类成员同名的新成员 则派生类的新成员隐藏 基类的同名成员 如果通过派生类的对象直接访问该成员 则只能访问到派生类的 成员 请参考 case07 7 14 cpp 如果派生类既有直接继承的基类又有间接继承的基类 并且他的某些直接继承的基 类又直接继承了派生类的间接继承基类 如 类 B0 派生了类 B1 和类 B2 而类 C 又继承了 B1 和 B2 那么类 C 在内存中就同时拥有两份 B0 中的成员 一份来自 B1 继承的 B0 另一份来自 B2 继承的 B0 在这种情况下 如果派生类对象 objC 访问 B0 中成 员 就 会 出 现 二 义 性 其 解 决 办 法 是 使 用 作 用 域 运 算 符 请 参考 case07 7 15 cpp 但是大多数情况下 我们只需要一份这样的数据拷贝 需要使用虚基类来解决此问题 8 虚基类 将共同的基类设置为虚基类 这是从不同的路径继承过来的同名数据成员在内存中就只 有一个拷贝 同一个函数也只有一个映射 请参考 case07 7 16 cpp case07 7 17 cpp case07 7 19 cpp case07 7 20 cpp 9 实验内容 1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC 20059:2025 EN Information technology - Methodologies to evaluate the resistance of biometric systems to morphing attacks
- 内蒙古大学数学试卷
- 奶粉品尝活动方案策划(3篇)
- 米字支撑施工方案(3篇)
- 鹤壁路面开槽施工方案(3篇)
- 感恩业主品牌活动策划方案(3篇)
- 挖碴装车施工方案(3篇)
- 药械知识考试题库及答案
- 北京市门头沟区2023-2024学年八年级下学期期中考试道德与法制考题及答案
- 新材料作文题目及答案
- 2025年电抗器行业当前市场规模及未来五到十年发展趋势报告
- 新班主任自我介绍课件
- 2025年副高卫生职称-公共卫生类-妇女保健(副高)代码:093历年参考题库含答案解析(5卷)
- 2025广西中考英语真题(原卷版)
- 餐饮行业食品安全管理实务培训教材
- 反歧视艾滋病课件
- 基孔肯雅热防控技术指南2025版培训课件
- 员工创新奖励办法
- 毛衫各部位基本尺寸测量表示法中英文对照适用毛织厂
- 金沙县光热水气候条件分析.
- TI84 PLUS计算器培训教材
评论
0/150
提交评论