C 高级语言程序设计第八章PPT课件.ppt_第1页
C 高级语言程序设计第八章PPT课件.ppt_第2页
C 高级语言程序设计第八章PPT课件.ppt_第3页
C 高级语言程序设计第八章PPT课件.ppt_第4页
C 高级语言程序设计第八章PPT课件.ppt_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

2020 3 19 可编辑 1 C 高级语言程序设计 第8章继承与派生北京邮电大学信息与通信工程学院 第8章继承与派生 8 1继承的概念8 2定义基类和派生类8 3构造函数和析构函数8 4转换与继承 2020 3 19 北京邮电大学信息与通信工程学院 2 回顾 上章 类对象本章 继承的概念和分类 继承的用法 如何继承某个祖先类的功能 如何为后代类添加新的功能 2020 3 19 北京邮电大学信息与通信工程学院 3 2020 3 19 可编辑 4 8 1继承的概念 自行车 8 1继承的概念 例子 自行车Bicycle 2020 3 19 北京邮电大学信息与通信工程学院 5 8 1继承的概念 例子 双人自行车TandemBike 2020 3 19 北京邮电大学信息与通信工程学院 6 8 1继承的概念 例子 竞速自行车RacingBike 2020 3 19 北京邮电大学信息与通信工程学院 7 8 1继承的概念 例子 山地车MountainBike 2020 3 19 北京邮电大学信息与通信工程学院 8 8 1继承的概念 例子 山地车继承了自行车的特征 山地车 派生 于自行车 2020 3 19 北京邮电大学信息与通信工程学院 9 8 1继承的概念 类的继承是在现有类的基础之上 创建新类的机制 称现有的类为基类 新建立的类为派生类 intWheel boolRun intWheel boolRun intSeat 从基类继承 2020 3 19 北京邮电大学信息与通信工程学院 10 2020 3 19 可编辑 11 8 2定义基类和派生类 8 2定义基类和派生类 定义派生类时要声明继承方式访问控制受继承方式的影响继承导致一种特殊的语法现象 同名覆盖 三种继承方式public protected private不同继承方式的影响主要体现在 派生类成员对基类成员的访问控制 派生类对象对基类成员的访问控制 2020 3 19 北京邮电大学信息与通信工程学院 12 2020 3 19 可编辑 13 8 2 1简单的继承和派生 例8 1简单的继承和派生 问题 想在屏幕上画出正三角形 矩形或圆形方法一 结构化方法DrawTri intx inty charcolor intside DrawRect intx inty charcolor intlength intwidth DrawCircle intx inty charcolor intRadius 方法二 面向对象 classcircle圆形classrectangle矩形classtriangle三角形基类 classshape色彩color位置 x y 泛化 2020 3 19 北京邮电大学信息与通信工程学院 14 classTShape private uint x y 几何形状的位置public TShape uintgetX uintgetY voidsetX uintx voidsetY uinty voidDraw 成员函数的分类构造函数设置属性值读取属性值 2020 3 19 北京邮电大学信息与通信工程学院 15 TShape01 cpp 类TShape的实现 include TShape01 h includeusingnamespacestd TShape TShape x 10 y 10 voidTShape Draw cout ThisisTShape Draw endl 成员函数的分类构造函数设置属性值读取属性值执行 2020 3 19 北京邮电大学信息与通信工程学院 16 include TShape01 h classTEllipse publicTShape public voidDraw 成员函数的分类构造函数设置属性值读取属性值执行 2020 3 19 北京邮电大学信息与通信工程学院 17 TEllipse01 cpp 类TEllipse的实现 include TEllipse01 h includeusingnamespacestd voidTEllipse Draw cout Drawanellipsewithcolor endl 成员函数的分类构造函数设置属性值读取属性值 2020 3 19 北京邮电大学信息与通信工程学院 18 2020 3 19 可编辑 19 8 2 2定义派生类 8 2 2定义派生类 class派生类名 继承方式基类1 继承方式基类2 继承方式基类n 派生类成员声明 例如 已有基类b1和b2 定义派生类derive 其中包括私有整型成员newInt 公有函数成员intnewFun 私有函数成员intmax inta intb 写出类derive的定义 classderive publicb1 privateb2 private intnewInt public voidnewFun private intmax inta intb 2020 3 19 北京邮电大学信息与通信工程学院 20 2020 3 19 可编辑 21 8 2 3访问控制和继承关系 8 2 3访问控制和继承关系 类成员的可见性公共成员 public保护成员 protected私有成员 private继承的方式公有继承 public 保护继承 protected 私有继承 private 派生类继承了基类中的所有成员 但不包括构造函数析构函数 2020 3 19 北京邮电大学信息与通信工程学院 22 8 2 3访问控制和继承关系 不同继承方式决定的不同访问控制权限体现在 派生类的成员函数对其继承的基类成员的访问控制 其它模块通过派生类对象对其继承的基类成员的访问控制 继承来的成员的访问权限 2020 3 19 北京邮电大学信息与通信工程学院 23 1 公有继承 公有继承的派生类定义形式 class派生类名 public基类名 派生类新成员定义 基类成员在派生类中的访问属性不变 派生类的成员函数可以访问基类的公有成员和保护成员 不能访问基类的私有成员 派生类以外的其它函数可以通过派生类的对象 访问从基类继承的公有成员 但不能访问从基类继承的保护成员和私有成员 派生类成员函数可以访问 2020 3 19 北京邮电大学信息与通信工程学院 24 classPoint 基类public voidInitP floatxx 0 floatyy 0 X xx Y yy voidMove floatxOff floatyOff X xOff Y yOff floatGetX returnX floatGetY returnY private floatX Y classRectangle publicPoint 派生类public 新增公有函数成员voidInitR floatx floaty floatw floath InitP x y 访问基类公有函数W w H h floatGetH returnH floatGetW returnW private 新增私有数据成员floatW H intmain Rectanglerect cout rect X 可否 cout rect GetX 可否 return0 派生类中的成员函数可以直接访问基类中的public和protected成员 但不能访问基类的private成员 2020 3 19 北京邮电大学信息与通信工程学院 25 classPoint public voidInitP floatxx 0 floatyy 0 X xx Y yy voidMove floatxOff floatyOff X xOff Y yOff floatGetX returnX floatGetY returnY private floatX Y classRect publicPoint public 新增公有函数成员Rect floatx floaty floatw floath X x Y y W w H h floatGetH returnH floatGetW returnW private 新增私有数据成员floatW H intmain Rectr 1 2 3 4 cout r X cout r GetX return0 A public B private C protected D 嘛也不填 2020 3 19 北京邮电大学信息与通信工程学院 26 2 私有继承 私有继承的派生类定义形式 class派生类名 private基类名 派生类新成员定义 基类成员在派生类中的访问属性都变成private 派生类的成员函数可以访问基类的公有成员和保护成员 不能访问基类的私有成员 派生类以外的其它函数不能通过派生类的对象 访问从基类继承的任何成员 派生类成员函数可以访问 派生类对象 2020 3 19 北京邮电大学信息与通信工程学院 27 3 保护继承 私有继承的派生类定义形式 class派生类名 protected基类名 派生类新成员定义 基类成员公有成员和保护成员在派生类中变成保护类型的 基类的私有成员属性不变 派生类的成员函数可以访问基类的公有成员和保护成员 不能访问基类的私有成员 派生类以外的其它函数不能通过派生类的对象 访问从基类继承的任何成员 派生类成员函数可以访问 派生类对象 2020 3 19 北京邮电大学信息与通信工程学院 28 私有继承和保护继承的区别 孙类成员函数无法访问 孙类成员函数可以访问 2020 3 19 北京邮电大学信息与通信工程学院 29 继承方式影响访问控制 2020 3 19 可编辑 31 8 2 4同名覆盖 8 2 4同名覆盖override classbase public voidf cout base endl classderiver publicbase public voidf cout deriver endl intmain deriverderobj derobj f return0 输出结果 A baseB deriver OverRide 只能访问到派生类中的同名新成员 2020 3 19 北京邮电大学信息与通信工程学院 32 classShape public voidDraw protected classTriangle publicShape public Triangle intx inty charcolor R floatslen 1 floatGetSideLength const voidSetTriangle intx inty charcolor floatslen voidDraw private floatm SideLength 图形类中的同名覆盖 2020 3 19 北京邮电大学信息与通信工程学院 33 2020 3 19 可编辑 34 8 3构造函数和析构函数 8 3构造函数与析构函数 基类的构造函数和析构函数不能被派生类所继承派生类一般需要定义自己的构造函数和析构函数派生类的构造及析构函数通常会受到基类构造及析构函数的影响 2020 3 19 北京邮电大学信息与通信工程学院 35 2020 3 19 可编辑 36 8 3 1基类只有无参数构造函数 8 3 1基类只有无参数的构造函数 在基类具有无参构造函数 派生类又没有定义构造函数的时候 系统会自动的调用基类无参构造函数 来构造派生类对象中的基类成分 如果基类没有无参构造函数 派生类也不定义自己的构造函数 在编译的时候 一定会有语法错误 2020 3 19 北京邮电大学信息与通信工程学院 37 2020 3 19 可编辑 38 8 3 2派生类的构造函数 8 3 2派生类的构造函数 不参与继承的特殊函数构造函数析构函数作为特权地位的友元函数赋值运算符函数派生类需要自己定义的构造函数和析构函数 2020 3 19 北京邮电大学信息与通信工程学院 39 8 3 2派生类的构造函数 派生类名 派生类名 基类所需形参 本类成员所需形参 基类1 基类参数表1 基类n 基类参数表n 对象成员1 对象参数表1 对象成员m 对象参数表m 本类基本类型数据成员初始化 2020 3 19 北京邮电大学信息与通信工程学院 40 2020 3 19 可编辑 41 单继承时的构造函数派生类名 派生类名 基类所需的形参 本类成员所需的形参 基类名 参数 本类成员初始化赋值语句 2020 3 19 可编辑 42 classPoint 基类Point类的定义 public 公有函数成员Point intxx 0 intyy 0 X xx Y yy voidInitP intxx 0 intyy 0 X xx Y yy voidMove intxOff intyOff X xOff Y yOff intGetX returnX intGetY returnY private 私有数据成员intX Y 2020 3 19 可编辑 43 classRectangle publicPoint public Rectangle intx inty intw inth voidInitR intx inty intw inth InitP x y W w H h 派生类访问基类公有成员voidMove intxOff intyOff Point Move xOff yOff intGetX returnPoint GetX intGetY returnPoint GetY intGetH returnH intGetW returnW private 新增私有数据intW H 2020 3 19 可编辑 44 Rectangle Rectangle intx inty intw inth Point x y W w H h 本类成员初始化赋值语句 基类所需的形参 本类成员所需的形参 基类构造函数 TShape04 cpp include TShape04 h includeTShape TShape uintx uinty x x y y voidTShape Draw std cout ThisisTShape Draw std endl voidTShape getXY uint TShape04 htypedefunsignedintuint typedefunsignedcharuchar classTShape private uint x y 几何形状的位置protected 声明几何形状的颜色 允许TShape的派生类直接访问这些颜色属性 而不允许在类外通过类的对象直接访问这些属性 uchar RED GREEN BLUE public TShape uintx uinty voidgetXY uint 例8 4单继承派生类构造函数 2020 3 19 北京邮电大学信息与通信工程学院 45 TEllipse04 cpp include TEllipse04 h includeTEllipse TEllipse uintlongR uintshortR uintx uinty TShape x y longR longR shortR shortR 在派生类构造函数中初始化基类保护成员 RED 0 x00 GREEN 0 x00 BLUE 0 x00 TEllipse TEllipse voidTEllipse Draw uintx y getXY x y 调用基类函数获取椭圆的圆心坐标std cout RED GREEN BLUE atpoint std cout x y std endl 错误 在派生类中不能 访问基类私有成员std cout x y std endl TEllipse04 h include TShape04 h classTEllipse publicTShape protected uint longR shortR public TEllipse uintlongR uintshortR uintx uinty TEllipse voidDraw voidgetR uint 例8 4单继承派生类构造函数 2020 3 19 北京邮电大学信息与通信工程学院 46 例8 4单继承派生类构造函数 2020 3 19 北京邮电大学信息与通信工程学院 47 2020 3 19 可编辑 48 8 3 3包含内嵌对象的派生类构造函数 派生类名 派生类名 基类所需形参 本类成员所需形参 基类1 基类参数表1 基类n 基类参数表n 对象成员1 对象参数表1 对象成员m 对象参数表m 本类基本类型数据成员初始化 2020 3 19 北京邮电大学信息与通信工程学院 49 2020 3 19 可编辑 50 定义一个派生类deriver 它是基类base1和base2的多继承 Deriver类还有两个私有的内嵌对象成员 定义派生类deriver的构造函数 2020 3 19 可编辑 51 classbase1 private intm base1 data public base1 intdata m base1 data data 2020 3 19 可编辑 52 classbase2 private intm base2 data public base2 intdata m base2 data data 2020 3 19 可编辑 53 classAbc private floatm abc data public Abc floatdata m abc data data 2020 3 19 可编辑 54 classderiver publicbase1 publicbase2 private Abcm member1 m member2 doublem deriver data public deriver intbd1 intbd2 floatid1 floatid2 doubledd 2020 3 19 可编辑 55 deriver deriver intbd1 intbd2 floatid1 floatid2 doubledd base1 bd1 base2 bd2 m member1 id1 m member2 id2 m deriver data dd TShape05 h pragmaonce include GlobalType05 h include TColor05 h classTShape private uint x y 几何形状的位置protected TColor color 颜色public TShape uintx uinty TShape uintx uinty TColorcolor TShape voidgetXY uint GlobalType05 h pragmaonce 预处理指令 避免重复包含本头文件typedefunsignedintuint typedefunsignedcharuchar TColor05 h pragmaonce include GlobalType05 h enumEColorComponent RED GREEN BLUE classTColor private uchar RED GREEN BLUE public TColor constucharR 0 x00 constucharG 0 x00 constucharB 0 x00 普通构造函数TColor constTColor 例8 5派生类的构造函数 2020 3 19 北京邮电大学信息与通信工程学院 56 TColor05 cpp include TColor05 h TColor TColor ucharR 0 x00 普通构造函数ucharG 0 x00 ucharB 0 x00 RED R GREEN G BLUE B TColor TColor constTColor TEllipse h pragmaonce include TShape05 h include GlobalType05 h classTEllipse publicTShape protected uint longR shortR public TEllipse uintlongR uintshortR uintx uinty TColorcolor TEllipse uintlongR uintshortR uintx uinty TEllipse voidDraw voidgetR uint 例8 5派生类的构造函数 2020 3 19 北京邮电大学信息与通信工程学院 57 例8 5派生类的构造函数 2020 3 19 北京邮电大学信息与通信工程学院 58 TShape06 h pragmaonce include GlobalType06 h include TColor06 h classTShape private uint x y 几何形状的位置protected TColor color 颜色public TShape uintx uinty TShape uintx 0u uinty 0u 默认构造函数TShape uintx uinty TColorcolor TShape voidgetXY uint TEllipse06 cpp include TEllipse06 h includeTEllipse TEllipse uintlongR uintshortR uintx uinty TColorcolor TShape x y uintx uinty TColorcolor longR longR shortR shortR 在派生类构造函数中访问基类保护成员 color color TEllipse TEllipse uintlongR uintshortR uintx uinty TShape x y uintx uinty longR longR shortR shortR 例8 6遗漏的基类构造函数 2020 3 19 北京邮电大学信息与通信工程学院 59 派生类的构造函数的一般总结 派生类的构造函数的职责初始化基类初始化对象数据成员初始化基本类型的数据成员方式构造函数初始化列表构造函数函数体除非有特殊要求 const或者reference数据成员只能由初始化列表来获得初值 若不需做上述工作 则可不定义构造函数 而使用系统提供的默认构造函数 2020 3 19 北京邮电大学信息与通信工程学院 60 派生类的构造函数 构造函数的调用次序基类的构造函数内嵌对象的构造函数派生类的构造函数因此基类和内嵌对象的初始化只能放在初始化列表中 不能放到派生类的构造函数体中 多继承时 基类构造函数的调用顺序 按照定义派生类时这些基类被继承的顺序与他们在初始化列表的次序无关 有多个基类 多个内嵌对象 2020 3 19 北京邮电大学信息与通信工程学院 61 2020 3 19 可编辑 62 8 3 4析构函数 复习 析构函数的功能在对象消亡之前进行必要的清理工作 8 3 4析构函数 派生类不能继承基类的析构函数 需要自己定义析构函数 派生类的析构函数一般只负责清理位于堆区的成员 而不需清理位于栈区的成员 析构函数的调用次序与构造函数相反派生类的析构函数 函数体中的代码 派生类内嵌对象的析构函数3 基类的析构函数 2020 3 19 北京邮电大学信息与通信工程学院 63 2020 3 19 可编辑 64 includeusingnamespacestd classbase private intm base data public base intdata m base data data base cout baseobjectdeconstruction endl 2020 3 19 可编辑 65 classAbc private floatm abc data public Abc floatdata m abc data data Abc cout Objectmemberdeconstruction endl 2020 3 19 可编辑 66 classderiver publicbase private doublem deriver data Abcm member1 int m ptr public deriver intbd floatid doubledd deriver voidfunction 2020 3 19 可编辑 67 deriver deriver intbd floatid doubledd base bd m member1 id m deriver data dd m ptr newint 256 if m ptr NULL cout memoryerrorinderiverobj endl 2020 3 19 可编辑 68 deriver deriver if m ptr NULL delete m ptr cout Deriverobjdeconstruction endl 2020 3 19 可编辑 69 voidderiver function cout Maybeyouwanttodosomethingwithm ptrinthisfunction endl cout Doasyoulike endl 2020 3 19 可编辑 70 voidmain intn 1 floatx 2 0f doubled 3 0 deriverobj n x d obj function cout Theendofmainfunction endl 输出结果 Maybeyouwanttodosomethingwithm ptrinthisfunction Doasyoulike TheendofmainfunctionDeriverobjdeconstruction Objectmemberdeconstructionbaseobjectdeconstruction classTColor private string color public TColor stringcolor BLACK cout TColor构造函数 endl color color TColor cout TColor析构函数 endl Main07 cpp include includeusingnamespacestd classTPoint protected int x y public TPoint intx 0 inty 0 cout TPoint构造函数 x y endl x x y y TPoint cout TPoint析构函数 x y endl 例8 7派生类析构函数 2020 3 19 北京邮电大学信息与通信工程学院 71 classTEllipse publicTShape private TPoint pLeftFocus RightFocus public TEllipse TShape RightFocus 2 0 cout 派生类构造函数 endl pLeftFocus newTPoint 1 0 TEllipse cout 派生类析构 endl if pLeftFocus deletepLeftFocus intmain TEllipseelps return0

温馨提示

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

评论

0/150

提交评论