




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计 讲义 第12章 12 1多态性在C 中的体现所谓多态性就是当不同对象收到相同的消息时产生不同的动作 12 1 1编译时的多态性1 在一个类中说明的重载2 基类成员函数在派生类中重载12 1 2运行时的多态性先看下面的例子 第12章多态性与虚函数 include includeclasspoint protected intx y public point intx inty point x x point y y virtualvoidshow 定义虚函数 putpixel x y getcolor classcircles publicpoint intradius public circles intx inty intradius point x y circles radius radius voidshow circles x y radius main pointp1 10 10 circlesc1 100 100 50 setcolor 14 point ptr 定义指向基类的指针ptr 调用c1对象的show 12 2虚函数12 2 1对象指针1 一般对象的指针语法与指向一般变量的指针相同 2 引入派生类后的对象指针任何被说明为指向基类的指针都可以指向它的公有派生类 使用派生类对象指针时应注意的问题 1 可以用一个声明让指向基类对象的指针指向它的公有派生的对象 禁止指向私有派生的对象 2 不能将一个声明为指向派生类对象的指针指向其基类的一个对象 3 声明为指向基类对象的指针 当其指向派生类对象时 只能利用它来直接访问派生类中从基类继承来的成员 不能访问公有派生类中特定的成员 12 2 2为什么要引入虚函数 includeclassbase public voidwho cout thisistheclassofbase n classderive1 publicbase public voidwho cout thisistheclassofderive1 n classderive2 publicbase public voidwho cout thisistheclassofderive2 n main baseobj1 p derive1obj2 derive2obj3 p 运行结果 thisistheclassofbase thisistheclassofbase thisistheclassofbase thisistheclassofderive1 thisistheclassofderive2 从结果可以看出 通过指针引起的普通成员函数调用 仅仅与指针的类型有关 而与此刻正指向什么对象无关 12 2 3虚函数的定义及使用1 虚函数的定义 includeclassbase public virtualvoidwho 定义虚函数 cout base n classfrist publicbase public voidwho 重新定义虚函数 cout thefirstderivation n classsecond publicbase public voidwho 重新定义虚函数 coutwho 调用base类的who 版本 ptr 调用second类的who 版本 运行结果 basethefirstderivationthesecondderivation 2 虚函数与重载函数的关系3 多继承中的虚函数 includeclassa public virtualvoidf 定义f 为虚函数 cout classa n classb public voidf 定义f 为一般函数 cout classb n classaa publica publicb public voidf coutf 调用a类的f ptr2 调用b类的f ptr1 调用b类的f 此处f 为非虚函数 而ptr2 又为b的指针 运行结果 classaclassbclassaaclassb 若一个派生类 它的多个基类中有公共的基类 在公共基类中定义一个虚函数 则多级派生以后仍可以重新定义虚函数 使用级联式派生时要注意 指向派生类的指针不能继承 也就是说 基类的指针可以指向它的派生类 但不能再指向它的派生类的派生类 4 基类构造函数调用虚函数自学 12 2 4虚函数举例例3 include pragmahdrstop include U12 2 4 3 h pragmapackage smart init pragmaresource dfm Tf12 2 4 3 f12 2 4 3 enumbool false true structelement 定义链表中的结点结构intval element next classlist 定义链表类element elems public list elems 0 list virtualboolinsert int 定义虚函数virtualbooldeletes int 定义虚函数boolcontain int voidprint classset publiclist intcard public set card 0 boolinsert int 重定义虚函数booldeletes int 重定义虚函数 list list element tmp elems for element elem elems elem 0 tmp elem elem elem next deletetmp boollist insert intval 定义list类中插入元素的成员函数 element elem newelement 为新元素分配内存if elem 0 elem val val 将元素插入链表头elem next elems elems elem returntrue elsereturnfalse boollist deletes intval 定义list类中删除元素的成员函数 if elems 0 returnfalse 若表为空 返回falseelement tmp elems if elems val val 若待删除的元素为链表头元素elems elems next deletetmp returntrue else for element elem elems elem next 0 elem next if elem next val val 循环查找待删除元素tmp elem next elem next tmp next deletetmp returntrue returnfalse boollist contain intval 判元素val在链表中是否存在if elems 0 returnfalse if elems val val returntrue elsefor element elem elems elem next 0 elem elem next if elem next val val returntrue returnfalse voidlist print if elems 0 return inti 1 staticintj 0 j for element elem elems elem 0 elem elem next f12 2 4 3 Canvas TextOut 30 i 20 j IntToStr elem val boolset insert intval 在set类中的insert的重定义版本if contain val boolset deletes intval 在set类中的deletes重定义版本if list deletes val 调用基类中的此函数版本 card returntrue returnfalse fastcallTf12 2 4 3 Tf12 2 4 3 TComponent Owner TForm Owner void fastcallTf12 2 4 3 btnRunClick TObject Sender list ptr list1 定义基类对象list1和基类指针ptrsetset1 定义set类对象ptr ptr insert 456 ptr insert 23 ptr print 调用list类中的成员函数 void fastcallTf12 2 4 3 btnEndClick TObject Sender Close 12 3抽象类12 3 1纯虚函数与抽象类1 纯虚函数的概念定义形式 virtualtypefunc name 参数表 0 注意事项 在基类中定义为纯虚函数的函数 在任何派生类中都必须定义自己的版本 否则将引起语法错误 2 抽象类的概念如果类中至少有一个纯虚函数 那么就称该类为抽象类 使用抽象类的几点规定 1 抽象类只能用作其它类的基类 不能建立抽象类对象 2 抽象类不能用作参数类型 函数返回类型或显式转换的类型 3 可以声明指向抽象类的指针和引用 此指针可以指向它的派生类 进而实现多态性 举例说明如下 classfigure public virtualdraw 0 figurea 错误 不能建立抽象类对象figure ptr 正确 可以声明指向抽象类的指针figuref 错误 抽象类不能作为函数的返回类型voidg figure 错误 抽象类不能作为函数的参数类型figure 正确 可以声明抽象类的引用 12 3 2纯虚函数多态性的体现例2 includeclasscontainer 定义一个抽象类protected doubleradius public container doubleradius container radius radius virtualdoublesurface area 0 纯虚函数virtualdoublevolume 0 纯虚函数 classcube publiccontainer 定义正方体类public cube doubleradius container radius doublesurface area 虚函数在本类中的定义版本doublevolume classsphere publiccontainer 定义球体类public sphere doubleradius container radius doublesurface area 虚函数在本类中的定义版本doublevolume classcylinder publiccontainer 定义圆柱体类doubleheight public cylinder doubleradius doubleheight container radius cylinder height height doublesurface area 虚函数在本类中的定义版本doublevolume doublecube doublesurface area return radius radius 6 doublecube volume return radius radius radius doublesphere doublesurface area return4 3 1416 radius radius
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 孝感桥墩施工方案(3篇)
- 娱乐直播活动策划方案案例(3篇)
- 室外猜灯谜活动方案策划(3篇)
- 618活动策划方案目的(3篇)
- 名校教师考试题库及答案
- 北京市昌平区2024-2025学年八年级下学期期末考试道德与法制题目及答案
- 安徽省六安市舒城县2023-2024学年高一下学期期末考试地理考试题目及答案
- 感知艺术:初中美术欣赏与实践活动教案
- 定制家居产品销售及安装合同
- 叙事作文小小推销员250字(8篇)
- 2024年中国人寿:养老险总公司招聘笔试参考题库含答案解析
- 知识产权风险预警项目分析报告
- 南城一中高三年级工作计划
- 企业重组改变组织结构以提高效率
- 污水处理设施运维服务投标方案(技术标)
- 围术期高钾血症的识别与救治
- 微信点餐系统小程序的设计与实现
- 行业标准项目建议书
- 订单评审表-模板
- 夏米尔350Pedm火花机快速入门操作
- 人教新版高中物理必修说课实验练习使用多用电表
评论
0/150
提交评论