讲稿第5章继承与派生.ppt_第1页
讲稿第5章继承与派生.ppt_第2页
讲稿第5章继承与派生.ppt_第3页
讲稿第5章继承与派生.ppt_第4页
讲稿第5章继承与派生.ppt_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C 面向对象程序设计 2 第四章内容 4 1什么是运算符重载4 2运算符重载的方法4 3重载运算符的规则4 4运算符重载作为类成员函数和友元函数4 5重载双目运算符4 6重载单目运算符4 7重载流插入运算符和流提取运算符4 8不同类型数据间的转换 第5章 继承和派生 4 本章内容 5 1继承和派生的概念5 2派生类的声明方法5 3派生类的构成5 4派生类成员的访问属性5 5派生类的构造函数和析构函数5 6多重继承5 7基类和派生类的转换5 8继承与组合 5 目标 理解派生和继承的相关概念 掌握派生类的声明方式掌握派生类的构成和成员的访问属性 掌握派生类构造函数和析构函数的使用方法 掌握多重继承的方法 理解基类和派生类的转换方法 理解继承与组合的含义 6 5 1继承与派生的概念 继承 继承是类之间定义的一种重要关系 7 5 1继承与派生的概念 B类继承A类 或称从类A派生出B类 则A类称为基类 父类 类B称为派生类 子类 8 5 1继承与派生的概念 单继承 派生类从一个基类派生的继承关系 多继承 派生类从多个基类派生的继承关系 9 5 1继承与派生的概念 例 1 定义一个学生类Student 包括学生和姓名 以及显示信息的函数 2 定义一个大学生类CollegeStudent 包括学生 姓名和专业 以及显示信息的函数 10 5 1继承与派生的概念 classStudent public voiddisplay cout num cout name private intnum stringname classCollegeStudent public voiddisplay cout num cout name cout speciality private intnum stringname stringspeciality 能否在定义CollegeStudent时利用Student 而不用重新定义已有的成员 11 5 2派生类的声明方式 声明派生类的一般形式为 class派生类名 继承方式 基类名 派生类新增成员 继承方式 public private和protected 默认为private 12 5 2派生类的声明方式 classCollegeStudent publicStudent public voiddisplay1 cout speciality private stringspeciality 基类的成员在派生类中如何存在 13 5 3派生类的构成 派生类的成员包括从基类继承过来的成员和自己增加的成员两大部分 14 5 3派生类的构成 派生类的生成过程 接收基类成员 派生类接收基类中除构造函数和析构函数之外的全部成员 改造基类成员 通过继承方式改造基类成员的访问控制权限 对基类成员进行覆盖 即在派生类中声明一个和基类数据或函数同名的成员 添加新的成员 15 classStudent public Student intn stringna num n name na Student voidinput cin num name voiddisplay cout num name private intnum stringname classCollegeStudent privateStudent public voiddisplay cout speciality private stringspeciality 例 16 5 4派生类成员的访问属性 一 公有继承 17 classStudent public voiddisplay cout num name private intnum stringname classCollegeStudent publicStudent public voiddisplay1 cout num name speciality private stringspeciality 找问题 num和name在派生类中不可访问 18 classStudent classCollegeStudent publicStudent public voiddisplay1 cout speciality private stringspeciality voidmain CollegeStudents s display s display1 return0 改正 19 5 4派生类成员的访问属性 二 私有继承 20 classStudent public voiddisplay cout num name private intnum stringname classCollegeStudent privateStudent public voiddisplay1 cout speciality private stringspeciality voidmain CollegeStudents s display s display1 s speciality Computer return0 找问题 21 classStudent public voiddisplay cout num name private intnum stringname classCollegeStudent privateStudent public voiddisplay1 display cout speciality private stringspeciality voidmain CollegeStudents s display1 return0 改正 22 5 4派生类成员的访问属性 三 保护继承 23 5 4派生类成员的访问属性 三 保护继承由protected声明的成员称为受保护成员 简称保护成员 在同一类中保护成员和私有成员一样 只能被类内部的成员函数访问 而不能被类外访问 保护成员可以被派生类的成员函数访问 24 classStudent private intnum protected stringname classCollegeStudent protectedStudent public voiddisplay cout num cout name voidmain CollegeStudents s display s name Zhang return0 找问题 25 总结 类的成员的访问属性Public 可以再类内通过成员函数来访问 也可以在类外通过对象来访问 Private 只能再类内通过成员函数来访问Protected 只能再类内通过成员函数来访问 26 总结 派生后成员访问属性在派生类中的变化 原来在基类中的访问属性与上继承时的继承方式 即为基类成员在派生类中新的访问属性 Class基类 public 成员j1protected 成员j2private 成员j3 Class派生类 基类 public 成员p1protected 成员p2private 成员p3 public j1 j2 27 总结 派生后成员访问属性在派生类中的变化 原来在基类中的访问属性与上继承时的继承方式 即为基类成员在派生类中新的访问属性 Class基类 public 成员j1protected 成员j2private 成员j3 Class派生类 基类 public 成员p1protected 成员p2private 成员p3 Protected j2 j1 28 总结 派生后成员访问属性在派生类中的变化 原来在基类中的访问属性与上继承时的继承方式 即为基类成员在派生类中新的访问属性 Class基类 public 成员j1protected 成员j2private 成员j3 Class派生类 基类 public 成员p1protected 成员p2private 成员p3 private j2 j1 29 练习 classA 基类 public inti protected voidf2 intj private intk classB publicA public方式 public voidf3 protected voidf4 private intm classC protectedB protected方式 public voidf5 private intn 30 练习 例课后第一 二 三 四 五题 31 5 5派生类的构造函数和析构函数 一 简单派生类的构造函数简单派生类只有一个基类 数据成员中不包括基类的对象 简单派生类构造函数的定义形式为 派生类构造函数 总参数列表 基类构造函数 参数列表 派生类中新增数据成员初始化 32 classStu public Stu intn stringna num n name na protected intnum stringname classColStu publicStu public ColStu intn stringna strings Stu n na speciality s voiddisplay cout num name speciality private stringspeciality 例 33 5 5派生类的构造函数和析构函数 一 简单派生类的构造函数构造函数的执行顺序 基类的构造函数 派生类的构造函数 析构函数的执行顺序 派生类的析构函数 基类的析构函数 34 简单派生类的构造函数 派生类构造函数 总参数列表 基类构造函数 参数列表 派生类中新增数据成员初始化 构造函数的执行顺序 基类的构造函数 派生类的构造函数 析构函数的执行顺序 派生类的析构函数 基类的析构函数 35 5 5派生类的构造函数和析构函数 二 有子对象的派生类的构造函数有子对象的派生类是指类的成员包括类的对象 classStu protected intnum stringname classColStu publicStu public voiddisplay private stringspeciality Stus 36 5 5派生类的构造函数和析构函数 二 有子对象的派生类的构造函数有子对象的派生类构造函数的一般形式为 派生类构造函数 总参数列表 基类构造函数 参数列表 子对象名 参数列表 派生类中新增数据成员初始化 37 5 5派生类的构造函数和析构函数 二 有子对象的派生类的构造函数构造函数的执行顺序 基类的构造函数 子对象的构造函数 派生类的构造函数 38 5 5派生类的构造函数和析构函数 classB public B intbb b bb private intb classC publicB public C intcc c cc private BmemB intc 找问题 如何初始化 39 classB private intb public B intbb b bb cout B b endl classC publicB public C intaa intbb intcc B aa memB bb c cc cout C c endl private BmemB intc voidmain Cc 1 2 3 例 40 5 5派生类的构造函数和析构函数 三 多层派生时的构造函数一个类不仅可以派生出一个派生类 派生类还可以继续派生 形成派生的层次结构 多层继承时的访问属性多层派生时的构造函数不用列出每一层派生类的构造函数 只须写出其上一层派生类 即直接基类 的构造函数即可 41 classA public A intaa a aa private inta classB publicA public B intaa intbb A aa b bb private intb classC publicB public C intaa intbb intcc B aa bb c cc private intc 例 42 5 5派生类的构造函数和析构函数 什么时候在声明派生类的构造函数时需要对基类或对象成员进行初始化 如果派生类的基类或内嵌子对象所属的类中没有提供默认构造函数时 派生类需要声明构造函数 对继承的基类成员和内嵌子对象的成员进行初始化 43 5 5派生类的构造函数和析构函数 构造函数的执行顺序 基类的构造函数 子对象的构造函数 派生类的构造函数 析构函数的执行顺序 派生类的析构函数 子对象的析构函数 基类的析构函数 44 classA public A intaa a aa cout A a endl A cout A endl private inta classB public B intbb b bb cout B b endl B cout B endl private intb classC publicB public C intaa intbb intcc B bb a aa c cc cout C c endl C cout C endl private Aa intc voidmain Cc 1 2 3 例 45 5 6多重继承 多重继承 一个派生类同时继承多个基类 46 5 6多重继承 一 声明多重继承的方法class派生类名 继承方式 基类名1 继承方式 基类名2 继承方式 基类名n 派生类成员声明 47 classA public displayA cout a inta classB public displayB cout b intb classC publicA publicB public displayC cout c private intc 例 48 5 6多重继承 49 5 6多重继承 二 多重继承派生类的构造函数多继承下的构造函数和析构函数与单继承下的构造函数和析构函数是相似的 派生类的构造函数需要对基类成员 内嵌子对象和新增成员进行初始化 50 C inta1 inta2 intb1 intb2 intcc A a1 a a2 B b1 b b2 c cc 51 classB1 public B1 inti cout B1 i endl classB2 public B2 intj cout B2 j endl classB3 public B3 cout B3 endl classC publicB2 publicB1 publicB3 public C inta intb intc intd B1 a memB2 d memB1 c B2 b private B1memB1 B2memB2 B3memB3 voidmain Cobj 1 2 3 4 例 52 二 多重继承派生类的构造函数格式 派生类构造函数名 总参数列表 基类1构造函数 参数列表 基类2构造函数 参数列表 子对象1 参数列表 子对象2 参数列表 派生类中新增数据成员初始化语句 注意 调用基类 子对象的构造函数的顺序是按照声明派生类时基类 子对象出现的顺序来调用的 53 5 6多重继承 三 多重继承引起的二义性问题 classA public voiddisplay cout A endl classB public voiddisplay cout B endl classC publicA publicB voidmain Cc c display 找问题 54 5 6多重继承 三 多重继承引起的二义性问题 Cc c display 55 classA public voiddisplay cout A endl classB public voiddisplay cout B endl classC publicA publicB public voiddisplay cout C endl voidmain Cc c display 5 6多重继承 56 复习 5 5派生类的构造函数和析构函数 一 简单派生类的构造函数 二 有子对象的派生类的构造函数 三 多层派生时的构造函数5 6多重继承 一 声明多重继承的方法 二 多重继承派生类的构造函数 三 多重继承引起的二义性问题 57 简单派生类的构造函数 派生类构造函数 总参数列表 基类构造函数 参数列表 派生类中新增数据成员初始化 构造函数的执行顺序 基类的构造函数 派生类的构造函数 析构函数的执行顺序 派生类的析构函数 基类的析构函数 58 classStu public Stu intn stringna num n name na protected intnum stringname classColStu publicStu public ColStu intn stringna strings Stu n na speciality s voiddisplay cout num name speciality private stringspeciality 例 59 二 有子对象的派生类的构造函数 派生类构造函数 总参数列表 基类构造函数 参数列表 子对象名 参数列表 派生类中新增数据成员初始化 构造函数的执行顺序 基类的构造函数 子对象的构造函数 派生类的构造函数 60 classB private intb public B intbb b bb cout B b endl classC publicB public C intaa intbb intcc B aa memB bb c cc cout C c endl private BmemB intc voidmain Cc 1 2 3 例 61 三 多层派生时的构造函数多层派生时的构造函数不用列出每一层派生类的构造函数 只须写出其上一层派生类 即直接基类 的构造函数即可 62 classA public A intaa a aa private inta classB publicA public B intaa intbb A aa b bb private intb classC publicB public C intaa intbb intcc B aa bb c cc private intc 例 63 5 6多重继承 一 声明多重继承的方法class派生类名 继承方式 基类名1 继承方式 基类名2 继承方式 基类名n 派生类成员声明 64 classA public displayA cout a inta classB public displayB cout b intb classC publicA publicB public displayC cout c private intc 例 65 二 多重继承派生类的构造函数格式 派生类构造函数名 总参数列表 基类1构造函数 参数列表 基类2构造函数 参数列表 子对象1 参数列表 子对象2 参数列表 派生类中新增数据成员初始化语句 注意 调用基类 子对象的构造函数的顺序是按照声明派生类时基类 子对象出现的顺序来调用的 66 classB1 public B1 inti cout B1 i endl classB2 public B2 intj cout B2 j endl classB3 public B3 cout B3 endl classC publicB2 publicB1 publicB3 public C inta intb intc intd B1 a memB2 d memB1 c B2 b private B1memB1 B2memB2 B3memB3 voidmain Cobj 1 2 3 4 例 67 5 6多重继承 三 多重继承引起的二义性问题1 两个基类有同名成员2 两个基类和派生类有同名成员3 两个直接基类都继承于同一基类 68 5 6多重继承 三 多重继承引起的二义性问题 Cc c display 69 5 6多重继承 三 多重继承引起的二义性问题派生类新增加的同名成员将覆盖基类中的同名成员 70 classA public voiddisplay cout a endl classB publicA classC publicA classD publicB publicC public voiddisplay cout a endl voidmain Dd d display D类的display c B display B类从A类继承的display c C display C类从A类继承的display 例 71 5 6多重继承 E中能否只保留一份A的a和display 72 5 6多重继承 四 虚基类虚基类的作用 可以使得在继承间接共同基类时只保留一份成员 虚基类是在派生类的声明过程中声明的 一般形式为 class派生类名 virtual继承方式基类名 派生类的定义 73 classA public inta voiddisplay cout a endl classB virtualpublicA classC virtualpublicA classD virtualpublicA classE publicB publicC publicD voidmain Ee e a 1 e display 例 74 5 6多重继承 四 虚基类初始化如果在虚基类中定义了带参数的构造函数 且没有默认构造函数 则在其所有直接或间接派生类中 都必须通过初始化表对虚基类进行初始化 75 classA public A intaa a aa private inta classB virtualpublicA public B intaa intbb A aa b bb private intb classC virtualpublicA public C intaa intcc A aa c cc private intc classD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论