OOP第9部分__多态性PPT演示课件_第1页
OOP第9部分__多态性PPT演示课件_第2页
OOP第9部分__多态性PPT演示课件_第3页
OOP第9部分__多态性PPT演示课件_第4页
OOP第9部分__多态性PPT演示课件_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

Email:yangjucheng,杨巨成江西财经大学信息学院,面向对象程序设计,内容提要,多态性:16.6多态的思考方式16.7多态性如何工作16.8不恰当的虚函数16.9虚函数的限制16.10类的冗余16.11克服冗余带来的问题16.12类的分解16.13抽象类16.14由抽象类派生具体类16.15纯虚函数的需要性,五、多态性多态性:面向对象系统中的又一重要概念,4大特性之一。多态性是通过函数重载来实现的。多态性:当不同的对象收到相同的消息时产生不同的动作(本书的多态性概念:运行时确定调用哪个函数的能力称为多态性),16.5多态性,两种多态性,面向对象系统的二种编译方式:早期联编系统在编译时就确定如何实现某一动作,提供了执行速度快的优点。滞后联编系统在运行时动态实现某一动作,提供了灵活和高度抽象的优点。早期联编和滞后联编都支持多态性。C+系统支持二种多态性:静态多态性编译时的多态性。动态多态性运行时的多态性。,1、静态多态性通过函数重载实现函数重载的二种方式:在同一个类中重载和基类成员在派生类中的重载。在同一类中重载:同名的成员函数,根据参数等不同,自动予以区别。基类成员在派生类中的重载:,classApublic:voidshow();classB:publicApublic:voidshow()voidshow(intxx);voidmain()Aa1;Bb1;a1.show();/调用A类的show()函数,操作数据是对象a1的。b1.show();/调用B类的show()函数,操作数据是对象b1的。b1.show(55);/调用B类的show(intxx)函数,操作数据是对象b1.b1.A:show();/调用A类的show()函数,操作数据是对象b1.,2、动态多态性classStudentpublic:floatcalcTuition()/计算学费/;classGraduatStudent:publicStudentpublic:floatcalcTuition()/计算学费/;voidfn(Student/计算研究生gs的学费C+中,运行时的多态性是通过虚函数重载来实现的。,函数调用的实际参数,随应用程序的运行进展而变更,函数fn()在编译时无法确定。C+的继承机制中用一种称为多态性的技术来解决这个问题。这种在运行时,能依据其类型确定调用哪个函数的能力,称为多态性,或迟后联编(latebinging)。,16.6多态的思考方式,六、多态的思考方式对于同一件事,对象不同,实际操作有所不同。若语言不支持多态,则不能称为面向对象。只支持类而不支持多态,称为基于对象,如VB。,七、多态性如何工作运行时的多态性通过虚函数实现。虚函数:是一种动态的函数重载的方式,虚函数允许函数调用与函数体之间的联系在运行时才建立。1、对象指针可以通过指针访问对象例:classApublic:show()a1,*p=,一般对象的指针:各类的指针相互独立,不能混用。例:classAa1,*pa;classBb1,*pb;指针pa只能指向A类对象,不能指向B类对象;指针pb只能指向B类对象,不能指向A类对象。派生类的指针与基类的指针之间相互有关。,16.7多态性如何工作,2、为什么引入虚函数(ch16_2.cpp),classAintx,y;public:voidshow()coutclassA.endl;voidview()coutclassAview().endl;classB:publicAintx,y;public:voidshow()coutclassB.endl;voidsh()coutclassBsh().endl;classC:publicBintx;public:voidshow()coutclassC.endl;voidsh()coutclassCsh().endl;,voidmain()Aa,*pa=,执行结果:classA.classA.classA.classB.classBsh().classC.classCsh().classAview().,执行结果分析:通过指针对成员函数的调用,仅仅与指针本身的类型有关,与指针当前指向的对象无关。如果要与当前对象有关,必须对指针类型进行强制转换。,引入虚函数:把上例中基类的show()函数声明成虚函数即可(函数原型前加关键字:virtual)。,希望:通过指针进行一种动态的指向。即:指针指向的对象不同,执行不同的重载成员函数。,3、虚函数的定义和使用定义:在函数原型前面加“virtual”即可例1:上面的例题,把类A的成员函数show()改成虚函数,其他不作任何改动:virtualvoidshow()coutclassA.write(a1);voidmain()Monochromemc;SVGAcolr;char*st=“Thisisateststring.”func(/合法:因为一个SVGA是一个Display,关于抽象类和纯虚函数的说明:1、抽象类只能作为其他类的基类,不能创建对象。2、抽象类不能用作函数形参的类型、函数返回类型,不能进行显式类型转换。3、可以定义抽象类的指针,此指针可以指向其非抽象类的派生类的对象,以实现动态多态性。4、在抽象类的派生类中,如果没有给出基类的纯虚函数的具体定义,则该派生类仍是一个抽象类;如果在派生类的派生类中,还没有给出基类的纯虚函数的具体定义,则该派生类的派生类还是一个抽象类。,小结1、在派生类中允许重载基类的成员函数。如果基类中的函数是虚函数,当指针或引用访问对象时,将

温馨提示

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

评论

0/150

提交评论