《面向对象程序设计》讲义.ppt

上传人:max****ui 文档编号:8313184 上传时间:2020-03-28 格式:PPT 页数:38 大小:485.50KB
返回 下载 相关 举报
《面向对象程序设计》讲义.ppt_第1页
第1页 / 共38页
《面向对象程序设计》讲义.ppt_第2页
第2页 / 共38页
《面向对象程序设计》讲义.ppt_第3页
第3页 / 共38页
点击查看更多>>
资源描述
面向对象程序设计 讲义 第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 doublesphere volume return3 1416 radius radius radius 4 3 doublecylinder doublesurface area return3 1416 2 radius height radius doublecylinder volume return3 1416 radius radius height main container ptr cubeobj1 5 sphereobj2 5 cylinderobj3 5 5 ptr
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!