




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章多态 问题的提出多态在本章的表现形式总结与建议 头说 大家去工作吧 1 多态定义 不同类型的对象接收同样的消息产生不同的行为2 现实需要多态 面向对象需要多态 它以归整划一的方式在特定时刻处理多个类型不同的对象 返回 运算符重载虚函数抽象类 纯虚函数 多态在本章主要的表现形式 返回 运算符重载 设计思想运算符重载的基本形式运算符重载的实例注意事项 返回 运算符重载设计思想 扩展系统已有运算符的功能 能处理自定义数据类型定义与特定运算符同名的函数此函数与类相关联 成员或友元 以函数处理特定的自定义数据类型C 系统通过函数重载的方式来定位 执行此特殊函数 返回 运算符重载分类 运算符重载 按载体 类的成员函数类的友元函数 按对象个数 重载单目运算符 前置与后置重载双目运算符 返回 可以重载为普通函数吗 看完所有例子再回答 呵呵 重载分类之一 重载为类成员函数参数个数 原操作数个数 1 后置 除外 重载为友元函数参数个数 原操作数个数 且至少应该有一个自定义类型的形参 要理解参数个数的原因 格式 重载为类成员函数格式 函数类型operator运算符 形参 重载为友元函数格式friendly函数类型operator运算符 形参 返回 Operator 重载关键字 重载分类之二 单目运算符 前置单目运算符 Uoprd无形参 表达式Uoprd相当于oprd operatorU 后置单目运算符oprdU有一个int类型形参表达式oprd 相当于oprd operator 0 oprd为特定的对象 重载分类之二 oprd1 oprd2为特定类的对象 双目运算符B 重载后 表达式oprd1Boprd2相当于oprd1 operatorB oprd2 返回 重载举例1 用 能够实现复数的加减运算 classcomplex public complex doubler 0 0 doublei 0 0 real r imag i friendcomplexoperator complexc1 complexc2 重载为友元函数complexoperator complexc1 重载为成员函数voiddisplay 显示复数的值private 私有数据成员doublereal doubleimag 跳回 complexoperator complexc1 complexc2 运算符重载友元函数实现 returncomplex c2 real c1 real c2 imag c1 imag complexcomplex operator complexc1 运算符重载成员函数实现 returncomplex real c1 real imag c1 imag voidcomplex display cout real imag endl 注意 重载为类的成员函数 操作对象个数少一 voidmain 主函数 complexc1 5 4 c2 2 10 c3 声明复数类的对象cout c1 c1 display cout c2 c2 display c3 c1 c2 使用重载运算符完成复数减法cout c3 c1 c2 c3 display c3 c1 c2 使用重载运算符完成复数加法cout c3 c1 c2 c3 display 程序运行结果 c1 5 4 c2 2 10 c3 c1 c2 3 6 c3 c1 c2 7 14 请看一个对此例改装的例子 补充例子 include iostream h structcomplex doublereal doubleimag friendcomplexoperator complexc1 complexc2 complexoperator complexc1 complexc2 重载为友元函数complexoperator complexc1 complexc2 complexc3 c3 imag c1 imag c2 imag c3 real c1 real c2 real returnc3 voidmain 主函数 complexc1 c2 c3 声明复数结构体变量c1 imag 1 c2 imag 2 c1 real 3 c2 real 4 c3 c1 c2 使用重载运算符完成复数加法cout c3 c1 c2 endl cout c3 image c3 imag endl cout c3 real c3 real endl 执行结果 你明白了什么 函数一定要重载成友元或者成员函数么 重载举例2 重载 classClock 时钟类声明 public 外部接口Clock intNewH 0 intNewM 0 intNewS 0 voidShowTime voidoperator 前置单目运算符重载voidoperator int 后置单目运算符重载private 私有数据成员intHour Minute Second 操作数是时钟类的对象 实现时间增加1秒钟 voidClock operator 前置单目运算符重载函数 Second if Second 60 Second Second 60 Minute if Minute 60 Minute Minute 60 Hour Hour Hour 24 cout Clock 逢六十进一 voidClock operator int 后置单目运算符重载 Second if Second 60 Second Second 60 Minute if Minute 60 Minute Minute 60 Hour Hour Hour 24 cout Clock 其它成员函数的实现略voidmain ClockmyClock 23 59 59 cout Firsttimeoutput myClock ShowTime myClock myClock ShowTime myClock myClock ShowTime 程序运行结果为 Firsttimeoutput 23 59 59Clock 0 0 0 Clock 0 0 1 不可以重载C 中的运算符 sizeof只能重载C 语言中已有的运算符 不可臆造新的 不改变原运算符操作数个数 优先级和结合性 注意 6点 有一定的原因 C 系统对重载运算符的选择 遵循函数重载的原则经重载的运算符 其操作数中至少应该有一个是自定义类型 运算符重载是对已有的运算符赋予多重含义 返回 虚函数 虚函数设计思想 为了实现类族中多个对象运行时的多态 对比虚基类 为了解决继承中产生的二义性问题 什么是二义性问题 慢慢体会 虚函数的定义格式 定义 基类中将某一成员函数用virtural声明派生类中用函数原型相同的函数超越 覆盖 overriding 它 对比重载 overloaded classbaseA virtualvoidf classderiveB publicbaseA voidf 例1 includeclassB0 基类B0声明 public 外部接口virtualvoiddisplay cout B0 display endl 虚成员函数 虚函数 classB1 publicB0 公有派生 public voiddisplay cout B1 display endl classD1 publicB1 公有派生 public voiddisplay cout D1 display endl voidfun B0 ptr 普通函数 ptr display voidmain B0b0 p 声明基类对象和指针B1b1 声明派生类对象D1d1 声明派生类对象p 调用派生类D1函数成员 程序运行结果为 B0 display B1 display D1 display 跳回 抽象类定义classvehicle public vehicle floatspeed inttotal 构造函数 vehicle speed speed vehicle total total virtualvoidshowmember 0 纯虚函数的定义protected floatspeed inttotal 例2 classcarpublic vehicle 抽象类派生类 public 派生类的构造函数 实现基类的构造函数car intaird floatspeed inttotal vehicle speed total car aird aird virtualvoidshowmember 派生类函数重载 cout speed 1 total 2 endl protected intaird 调用如下 intmain void carb 250 150 4 b showmember return0 什么情况下需要使用纯虚函数 要在基类中抽象出一个方法 且该类被继承而不能被实例化时 基类的方法必须在派生类中被实现时 多个对象具有公共的抽象属性 但却有不同的实现要求时 虚函数小结 注意 6点 虚函数是非静态成员函数 是动态联编的基础虚函数具有传递继承性 基类中声明了虚函数 派生类中无论是否说明 同原型函数都自动为虚函数在类的声明中 在函数原型之前写virtual 不能用在函数实现 定义 时 无需为整个类的对象共享 本质 不是重载而是覆盖 调用方式 通过基类指针或引用 执行时会根据指针指向的对象的类 决定调用哪个函数 构造函数不能是虚函数 析构函数可以是虚函数 参考书上P265例8 5 返回 抽象类 纯虚函数 带有纯虚函数的类称为抽象类class类名 virtual类型函数名 参数表 0 纯虚函数 纯虚函数的定义格式 定义纯虚函数的目的 和虚函数类似 与Java中的接口类类似 并且对于本类不定义其函数体 举例 includeclassB0 抽象基类b0声明 public 外部接口virtualvoiddisplay 0 纯虚函数成员 对比 voidf classB1 publicB0 公有派生 public voiddisplay cout B1 display endl 虚成员函数 classD1 publicB1 公有派生 public voiddisplay cout D1 display endl 虚成员函数 voidfun B0 ptr 普通函数 ptr display voidmain 主函数 B0 p 声明抽象基类指针B1b1 声明派生类对象D1d1 声明派生类对象p 调用派生类D1函数成员 程序的运行结果为 B1 display D1 display 注意 抽象类是类的抽象 抽象的抽象对于暂时无法定义的函数 可以声明为纯虚函数 给派生类去实现 抽象类只能作为基类来使用 不能声明抽象类的对象 可以定义抽象的指针或引用来指向其派生类的对象 访问其派生类函数成员从而体现多态的特征 返回 行为的抽象 多态的含义 重载多态强制多态
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版片石石材雕刻艺术创作合同协议书范本
- 2025年特种车辆租赁安全合同
- 2025版私人抵押车辆评估与交易合同样本
- 河北省霸州市2025年上半年公开招聘辅警试题含答案分析
- 2025年数字博物馆电脑室设备购置安装服务合同
- 2025年度汽车事故免责保障合同
- 海南省琼中黎族苗族自治县2025年上半年公开招聘村务工作者试题含答案分析
- 海南省临高县2025年上半年公开招聘城市协管员试题含答案分析
- 2025年度专利技术使用权转让合同
- 2025版网络安全人员劳务合同范本
- 高三5月大联考作文“新技术”“新产业”“新质生产力”导写
- 手持电动工具安全培训
- (正式版)JBT 9229-2024 剪叉式升降工作平台
- 沃特玛通信基站用铁锂电池
- 曲臂车操作规程含曲臂式高空作业车专项施工方案报审表
- 2019版新人教版高中英语必修+选择性必修共7册词汇表汇总(带音标)
- 熟食行业食品安全培训
- 度假村项目策划书
- 黑龙江小学生诗词大赛备考试题库400题(一二年级适用)
- 《HSK标准教程1》第4课课件
- 混凝土裂缝处理的讲座
评论
0/150
提交评论