239-11-计算机程序计-1第11章 继承(zpyang).ppt_第1页
239-11-计算机程序计-1第11章 继承(zpyang).ppt_第2页
239-11-计算机程序计-1第11章 继承(zpyang).ppt_第3页
239-11-计算机程序计-1第11章 继承(zpyang).ppt_第4页
239-11-计算机程序计-1第11章 继承(zpyang).ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

计算机程序设计 第11章继承教师 杨振平E mail zpyang 2011 2012第二学期 继承与派生类派生类的继承方式和访问属性派生类的构造函数和析构函数 授课内容 继承 反映类之间的一种关系 在一个类或多个类基础上构建新类的过程称为类的继承 其中一个类或多个类称为基类 父类 而构件的新类称为派生类 子类 C 中的继承有 单继承 由一个基类构建的派生类 多继承 由多个基类构建的派生类 11 1继承与派生类 飞机类 火箭类 航天飞机类 多继承 航天飞机是从飞机和火箭继承来的 飞机类 属性 机翼 起落架 方法 能够起飞 降落火箭类 属性 火箭发动机 方法 发射太空航天飞机类 拥有飞机和火箭的性能 能发射也能着陆 基类 派生类 人员类 学生类 教师类 研究生类 单继承 单继承 多继承 例 从人员类派生出其它类 继承的目的是实现 代码重用 派生类强调对基类进行扩充增加新成员对基类成员进行改造改变对基类成员的访问权限对基类成员函数进行重定义 继承与派生的目的 派生类的定义格式 class派生类名 继承方式基类名1 继承方式基类名2 新增成员及对基类成员进行改造 三种继承方式 public protected和private 默认 11 2派生类的继承方式和访问属性 公有继承方式 class派生类名 public基类名 新增成员及对基类成员进行改造 基类的公有成员和保护成员在派生类中访问控制权限保持不变 基类的私有成员 在派生类中是无法直接访问 在派生类外部也无法通过派生类对象直接访问 特征 例定义人员类Person 并派生雇员类Employee 人员类定义classPerson private charName 10 姓名intAge 年龄charSex 性别public voidRegister char name intage charsex 设置数据成员voidShowMe 输出数据成员 Person类的成员函数 设置数据成员voidPerson Register char name intage charsex strcpy Name name Age age Sex sex m m f voidPerson ShowMe 输出数据成员 cout Name t Sex t Age t 定义雇员类Employee classEmployee publicPerson 雇员类定义 charDept 20 工作部门floatSalary 月薪public Employee 派生类构造函数 EmployeeRegister XXX 0 m XXX 0 调用本类成员函数 voidEmployeeRegister char name intage charsex char dept floatsalary voidShowEmp 显示雇员信息 继承自基类中的数据成员 Name Age Sex 继承自基类中的成员函数 Register ShowMe 雇员类Employee中成员函数 voidEmployee EmployeeRegister char name intage charsex char dept floatsalary Register name age sex 调用继承自基类的公有成员函数strcpy Dept dept Dept和Salary为派生类中数据成员Salary salary 将Register name age sex 改为Age age strcpy Name name Sex sex 可以吗 voidEmployee ShowEmp ShowMe 调用继承自基类的公有成员函数cout Dept t Salary endl 也不能将ShowMe 改为 cout Name t Sex t Age t 错误信息提示 使用基类的公有成员函数Register 访问 成功 使用基类的公有成员函数ShowMe 访问 成功 测试Employee类的main 函数 intmain Employeeemp 访问不带参数的构造函数emp ShowEmp emp EmployeeRegister 张弓长 40 f 图书馆 2000 emp ShowEmp emp ShowMe return0 分析调用成员函数的合法性 由于EmployeeRegister ShowEmp是雇员类Employee的公有成员函数 因此外界可使用对象直接访问 ShowMe是基类Person的公有成员函数 经过公有方式派生 在雇员类中仍保持公有属性 因此使用雇员类对象emp也可以直接访问 结果 XXXm0XXX0张弓长f40图书馆2000张弓长f40 私有继承方式class派生类名 private基类名 新增成员及对基类成员进行改造 11 2派生类的继承方式和访问属性 续 基类的公有和保护成员转为派生类的私有成员 这些成员只能由派生类的成员函数直接访问 对于基类的私有成员 在派生类中都无法直接访问 特征 classEmployee privatePerson 雇员类定义 charDept 20 工作部门floatSalary 月薪public Employee EmployeeRegister XXX 0 m XXX 0 voidEmployeeRegister char name intage charsex char dept floatsalary voidShowEmp 显示雇员信息 如果将上例中雇员类继承方式从public改为private 则程序执行时会产生错误 intmain Employeeemp 访问不带参数的构造函数emp EmployeeRegister 张弓长 40 f 图书馆 2000 emp ShowEmp emp ShowMe return0 分析 因为ShowMe是基类的公有成员函数 经私有方式继承 在雇员类中ShowMe变为私有成员函数 因此外界不可以通过派生类对象直接访问 非法调用 ShowMe 函数在Employee类中为private属性 因此在该类之外不能访问 通过添加公有的成员函数ShowBase 解决上述问题 classEmployee privatePerson charDept 20 floatSalary public Employee EmployeeRegister XXX 0 m XXX 0 voidShowEmp voidShowBase voidEmployee ShowBase ShowMe 调用继承自基类中的成员 在main 中将emp ShowMe 改为emp ShowBase intmain Employeeemp 定义时不需要初始化emp EmployeeRegister 张弓长 40 f 图书馆 2000 emp ShowEmp emp ShowBase 不是emp ShowMe return0 保护继承方式class派生类名 protected基类名 新增成员及对基类成员进行改造 11 2派生类的继承方式和访问属性 续 基类的公有成员在派生类中转为保护成员 基类的保护成员在派生类中保持不变 仍是保护的 基类的私有成员 无论派生类内部成员或通过派生类对象都无法直接访问 特征 11 3派生类的构造函数和析构函数 派生类什么时候必须定义构造函数 基类中有带参数的构造函数派生类中需要为新增加数据成员初始化派生类中可以定义析构函数 对基类数据成员初始化必须在初始化表中进行对内嵌对象成员初始化也必须在初始化表中进行 派生类构造函数定义格式 派生类名 派生类名 参数总表 基类名1 参数表1 基类名n 参数表n 内嵌对象名1 对象参数表1 内嵌对象名m 对象参数表m 派生类新增加成员的初始化 派生类的构造和析构函数举例 基类PersonclassPerson charName 10 姓名intAge 年龄public Person char name intage 构造函数 Person Person Person char name intage strcpy Name name Age age cout constructorofperson Name endl Person Person cout deconstructorofperson Name endl 派生类的构造和析构函数举例 续 classEmployee publicPerson 单继承 charDept 20 PersonPrincipal 内嵌对象public Employee char name intage char dept char name1 intage1 派生类构造函数声明 Employee 派生类的构造和析构函数举例 续 派生类构造函数定义Employee Employee char name intage char dept char name1 intage1 Person name age Principal name1 age1 strcpy Dept dept cout constructorofEmployee endl Employee Employee 析构函数 cout deconstrucorofEmployee endl 派生类的构造和析构函数举例 续 派生类构造函数的执行顺序 当建立派生类对象时 构造函数执行顺序如下 首先执行基类的构造函数 对于多继承派生类 按照基类被继承的顺序依次调用执行 如果类中有内嵌对象成员 则调用内嵌对象的构造函数 对于多个内嵌对象成员按照对象在派生类中声明的顺序执行 最后执行派生类构造函数体中的内容 派生类析构函数的执行顺序 当撤消派生类对象时 析构函数执行顺序 首先执行派生类中的析构函数然后执行内嵌对象的析构函数最后执行基类的析构函数 intmain Employeeemp 张弓长 40 人事处 李木子 36 return0 执行结果 constructorofperson张弓长 基类构造函数调用constructorofperson李木子 派生类对象的构造函数调用constructorofEmployee 派生类构造函数体deconstructorofEmployee 派生类析构函数体deconstructorofperson李木子 派生类对象的析构函数deconstructorofperson张弓长 基类析构函数调用 派生类构造函数和析构函数测试 例创建圆柱体类cylinder 已知圆柱体的底面半径和高 计算圆柱体的表面积和体积 分析 1 直接构造圆柱体类2 利用已有的Circle类 圆类 圆柱体类 圆 半径 计算面积 计算周长 输出数据成员的函数等 新增 圆柱体的高 求表面积 体积 输出数据成员的函数等 classCircle private doubler public Circle doubler doubleArea doublePerimeter voidPrintRadius Circle Circle doubler this r r doubleCircle Area returnPI r r doubleCircle Perimeter return2 PI r voidCircle PrintRadius cout r r endl Circle类 创建圆柱体类cylinder 由Circle类派生 classcylinder publicCircle private doubleh public cylinder doubleradius doublehigh doubleSurface Area doubleVolume voidPrint r h cylinder类的构造函数 cylinder cylinder doubleradius doublehigh Circle radius h high doublecylinder Surface Area doublep Perimeter doubles Area return2 s p h cylinder类的表面积函数 doublecylinder Volume doubles Area returns h cylinder类的圆柱体体积函数 voidcylinder Print r h cout 圆柱体基本数据 endl PrintRadius cout h h endl cylinder类中的输出函数 intmain doubler h cout r h cylinderv1 r h v1 Print r h cout 圆柱的表面积 v1 Surface Area endl cout 圆柱的体积 v1 Volume endl return0 测试cylinder类的main函数 Circle类 cylinder类 main函数 运行结果 例 从Point类派生Line类 在Line类中增加一个Point对象成员EndPoint 计算两点间线的长度 定义基类Point classPoint private intx y public Point int int voidprint intGetx returnx intGety returny Point Point intx inty this x x this y y voidPoint print cout x y classLine publicPoint private PointEndPoint public Line int int int int voidprint doubleLength 定义派生类Line Line L

温馨提示

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

评论

0/150

提交评论