面向对象编程技术与方法 课件 第7章多态_第1页
面向对象编程技术与方法 课件 第7章多态_第2页
面向对象编程技术与方法 课件 第7章多态_第3页
面向对象编程技术与方法 课件 第7章多态_第4页
面向对象编程技术与方法 课件 第7章多态_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

面向对象编程技术与方法(C++)

第7章多态第7章多态第7章

多态

7.1多态性概述

7.2虚函数

7.2.1虚函数的声明与应用

7.2.2虚析构函数

7.3如何实现动态绑定

7.4纯虚函数与抽象类

7.5小结

第7章多态7.1多态性概述

7.2虚函数 7.3如何实现动态绑定 7.4纯虚函数与抽象类 7.5小结

第7章多态7.1多态性概述对于重载函数,在调用函数处,编译器能够根据类型匹配情况确定要调用哪个函数。这个工作是在编译连接阶段进行的,称为静态绑定(staticbinding)或早期绑定(earlybinding)。面向对象多态(polymorphism)的目的,是让处理基类对象的程序代码,能够处理派生类对象。或者说,对于同样的消息(函数调用),被不同类型对象接收时导致不同的行为。这个功能是通过虚函数实现的。虚函数机制使得函数调用与函数体的联系可以在程序运行时确定,这称为动态绑定(dynamicbinding),又称为晚期绑定或运行时绑定。第7章多态7.1多态性概述 7.2虚函数

7.3如何实现动态绑定 7.4纯虚函数与抽象类 7.5小结

第7章多态7.2虚函数7.2.1虚函数的声明与应用将一个成员函数声明为虚函数,就是在前面添加关键字virtual。第7章多态这种在派生类中对virtual函数的再定义,称为重写(overriding),注意要与函数重载(overloading)与第6章中的函数同名屏蔽区分开。由于虚机制的存在,程序在运行时根据对象的类型去调用合适的成员函数。这样的程序结构具有很好的可扩展性。例如可以在基类的基础上派生出任意的新类型,而函数test()不需做任何改变就可用于新类型的对象。1. 虚函数是成员函数,但不会是静态成员函数。2. 如果虚函数定义在类体外,则关键字virtual只能出现在类内的函数声明前。当使用作用域运算符“::”时,虚机制不再起作用。派生类中的对应函数接口必须与基类中的完全相同。对函数返回类型可以稍微放松要求,如果基类中的虚函数返回类型是A*(或A&),派生类中重写的函数可以返回B*(或B&),其中B是A的public派生类。如果不满足这些要求,则派生类中的同名函数就不是对基类虚函数的重写,而是重新定义的一个函数,即使带有关键字virtual也是如此。如果原函数有默认形参值,就不要在派生类中再定义新的形参值。因为默认形参值是静态绑定的,只能来自基类中的定义。在多层次继承中,如果派生类没有对基类的虚函数进行重写,则自动调用继承层次中最近的虚函数。使用虚函数时应注意以下几点:第7章多态要想实现运行时的多态,必须满足三个基本条件:1)public继承;2)虚函数;3)通过指针(或引用)调用虚函数。第7章多态运行结果:Graduate::Show()Graduate::Show()UnivPerson::Show()Student::Study()Student::Eat()Graduate::Eat()Student::Study()Graduate::Show()第7章多态7.2虚函数7.2.2虚析构函数构造函数不能为虚函数,而析构函数可以是虚函数。如果基类的析构函数是虚函数,则所有派生类的析构函数都自动为虚函数。将析构函数声明为虚函数,可以使程序运行更加安全。运行结果:ConstructorofCPoint.ConstructorofRectangle.DestructorofCPoint.改成虚析构函数后的运行结果:ConstructorofCPoint.ConstructorofRectangle.DestructorofRectangle.DestructorofCPoint.第7章多态7.1多态性概述 7.2虚函数 7.3如何实现动态绑定

7.4纯虚函数与抽象类 7.5小结

第7章多态7.3如何实现动态绑定对于含虚函数的类,编译器为每个类建立唯一的虚函数表vtable,表中存放该类的虚函数的地址,包括新声明的以及继承的虚函数。编译器还为每个类加上一个数据成员vptr,这是一个指向虚函数表的指针。虚函数表中的顺序,与类中虚函数的声明顺序一致。派生类会继承基类的虚函数表,当在派生类中重写虚函数时,表中元素存储的地址将不再是基类虚函数的地址,而是派生类虚函数的地址。classA{public: intdata1; voidfun1(){} virtualvoidvfun1(){} virtualvoidvfun2(){}};

第7章多态classB:publicA{public: intdata2; voidfun1(){} virtualvoidvfun2(){}};第7章多态7.1多态性概述 7.2虚函数 7.3如何实现动态绑定 7.4纯虚函数与抽象类7.5小结

第7章多态7.4纯虚函数与抽象类在“形状-点-圆-球”这样的继承关系中,“形状”是比较抽象的概念,无法为其定义求面积的函数,但可以在基类中声明一个统一接口,在派生类中再给出求面积的实现。这样的虚函数称为纯虚函数:

virtual返回类型函数名(参数列表)=0; 注意纯虚函数声明中没有函数体,与函数定义不同: virtualdoubleArea(){}含有纯虚函数的类称为抽象类。不能定义抽象类的对象,可以声明抽象类引用或指向抽象类的指针。在抽象类基础上派生出的新类,如果给出了所有纯虚函数的实现,就不再是抽象类,否则仍是抽象类。运行结果:50.265412.5664第7章多态7.1多态性概述 7.2虚函数 7.3如何实现动态绑定 7.4纯虚函数与抽象类 7.5小结

第7章多态7.5小结虚函数是用virtual关键字声明的非静态成员函数。虚函数机制使得函数调用与函数体的联系可以在程序运行时确定。要想实现运行时的多态,必须满足三个条件:1)public继承;2)虚函数;3)通过指针(或引用)调用虚函数。构造函数不能是虚函数,析构函数可以是虚函数,而且常常被声明为虚函数。

温馨提示

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

评论

0/150

提交评论