C++面向对象程序设计 多态性与虚函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⑴函数重载实现多态:对同一个函数名,当用不同的实参调用时,会
调用到不同的重载函数版本,因而完成不同的功能,这是一种多态性 的体现。
⑵模板实现多态:模板是一类函数或类的样板,通过用不同的模板实
参调用模板,同一个名字可生成不同的具体函数或具体类,从而实现 不同的功能,这也是一种多态性的体现。
⑶虚函数实现多态:通过动态束定机制,使相同的函数调用代码可能
动态联编又称迟后联编(late binding),是在程序运行过程中 根据程序运行时的需要进行的。根据对象的不同来决定调 用哪个(成员)函数进行联编。在编译阶段,系统还不能 确定两者的对应关系。动态多态性是与动态联编相联系的。
docin/sundae_meng
蚌埠学院计算机系 5
C++面向对象程序设计
的内容实现多态性。但是,如果基类中的没有将函数print()定
义为虚函数,那么,即使在类层次中该函数被重载(函数名字
和参数表完全相同),仍然不可能实现任何多态性。在这种场Student类
合,联编还是静态的。
print()
docin/sundae_meng
Smallstudent类
蚌埠学院计算机系 pr7int()
在进行面向对象编程时,C++力求模仿客观世界的规律。多态性概念 也是体现了现实社会中各个事物之间的联系和作用。对同一个消息, 不同的对象会有不同的反应。比如一个经理要到外地出差,他会把这 个消息告诉他身边的人:他的妻子、秘书、下属;这些人听到这个消 息会有不同的反应:他的妻子会为他准备行李,下属会为他准备出差 的材料,秘书会为他安排车票和住宿。这就体现了多态性。
静态联编的最大优点是速度快,运行时的开销仅仅是传递 参数、执行函数调用、清除栈等。不过,程序员必须预测 在每一种情况下,在所有的函数调用中,将要使用哪些对 象。这不仅具有局限性,有时也是不可能的。
动态联编的问题显然是执行效率。这必须由代码本身在运 行时刻推测调用哪个函数,然后再调用它。有些语言,如 Smalltalk,仅使用动态联编。仅用动态联编大大加强了语 言的功能,但速度浪费也很严重。ANSI C只使用静态联 编,结果是速度快但灵活性不够。
蚌埠学院计ຫໍສະໝຸດ Baidu机系 2
C++面向对象程序设计
9.1 为什么需要多态性
前面章节讲述了面向对象程序设计的重要机制:数据抽象、封装和继 承,多态性也是面向对象的重要特征之一。若语言不支持多态,则不 能称为面向对象的。只支持类而不支持多态,只能称为基于对象的, 如Ada,VB等。多态性的应用,使面向对象编程技术比较容易处理各 种对象之间的相互作用;可以使编程显得更为简捷、便利,易于对程 序进行开发和扩展,它为程序的模块化设计提供了又一手段。
调用不同的类(基类或派生类)的虚函数,从而完成不同的功能,这
又是一种多态性的体现。
docin/sundae_meng
蚌埠学院计算机系 4
C++面向对象程序设计
9.1.2 静态多态性和动态多态性
编译时多态通过静态联编实现,运行时多态通过动态 联编实现。
1 联编 在面向对象程序设计中,联编(binding)的含义是把
C++面向对象程序设计
【例9-2】派生类对象替换基类对象。
见教材P114
从运行结果可以看出,以上几种方式调用的都是基类的 Speak()函数。因而可以得到下列重要结论:不论哪一种 情形,派生类对象替换基类对象后,只能当作基类对象来 使用。不论派生类是否存在同名覆盖成员,这样的基类对 象所访问的成员都只能来自基类。那么如何才能得到我们 需要的结果呢(形成多态)?可以使用虚函数来实现动态 联编。
在建立了类层次的场合,各个类可以有名字和参数表相同的成 员函数。图9.1显示出单继承建立的类层次。Student类描述学生
的特征。派生类Smallstudent描述小学生特征。派生类中重载
了函数print()。每个类的成员函数print()功能是显示相应对象
的数据成员。我们想实现不同的对象调用print()时,输出不同
一个函数名与其实现的代码联系在一起,即主调函数代码 必须与被调函数代码连接起来。
按照联编所在的阶段,联编分为静态联编(static binding) 和动态联编(dynamic binding)。 静态联编又称先期联编(early binding),是在编译时进行的, 即是在编译阶段就必须确定函数名与代码间的对应关系。 换句话说,主调函数和被调代码的关系早在编译时就确定 了。
多态性的概念是同样的消息被类的不同对象接收时导致完全不同行为 的一种现象。消息指对类的成员函数的调用。换句话说,每个不同的 对象可以以适合自己的方式去响应对同一个成员函数的调用。简单地 讲,多态性就是一种实现“一种接口,多种方法”的技术,是面向对 象程序设计的重要特性。
docin/sundae_meng
蚌埠学院计算机系 3
C++面向对象程序设计
9.1.1 多态性的实现方法
同一段代码,当用不同的对象去调用时,该代码具有不同的功能,这 称为多态性。C++提供的多态性分为静态多态性(编译时多态)和动 态多态性(运行时多态)。静态多态性是一种编译时的多态,是通过 重载和模板实现的。动态多态性是一种运行时的多态,其基础是数据 封装和继承机制,通过继承建立类层次,并通过在基类中定义虚函数 来实现多态性,即在基类和派生类中建立同名的函数,但是函数的功 能是不同的。
C++面向对象程序设计
第九章 多态性与虚函数
docin/sundae_meng
1
C++面向对象程序设计
学习目标
⑴理解多态性和虚函数的概念 ⑵了解静态多态性和动态多态性 ⑶掌握虚函数的定义和调用方法 ⑷掌握多态性的实现方法以及虚函数在其实现中起
到的作用 ⑸掌握纯虚函数和抽象类的概念及应用
docin/sundae_meng
docin/sundae_meng
蚌埠学院计算机系 6
C++面向对象程序设计
2 静态多态性
在没有类层次的场合,使用函数重载的方式实现静态多态性。 各个重载函数名称相同,但参数表应在参数个数、类型和次序 上有所不同。编译器根据参数表来识别各个重载函数。根据参 数表,系统在编译时就完成静态联编的过程。关于没有类层次 的函数重载实现多态的例子前面已经介绍,这里不再赘述。