- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
/sundae_meng C++面向对象程序设计 蚌埠学院计算机系 * C++面向对象程序设计 第九章 多态性与虚函数 /sundae_meng * 学习目标 ⑴理解多态性和虚函数的概念 ⑵了解静态多态性和动态多态性 ⑶掌握虚函数的定义和调用方法 ⑷掌握多态性的实现方法以及虚函数在其实现中起到的作用 ⑸掌握纯虚函数和抽象类的概念及应用 /sundae_meng * 9.1 为什么需要多态性 前面章节讲述了面向对象程序设计的重要机制:数据抽象、封装和继承,多态性也是面向对象的重要特征之一。若语言不支持多态,则不能称为面向对象的。只支持类而不支持多态,只能称为基于对象的,如Ada,VB等。多态性的应用,使面向对象编程技术比较容易处理各种对象之间的相互作用;可以使编程显得更为简捷、便利,易于对程序进行开发和扩展,它为程序的模块化设计提供了又一手段。 在进行面向对象编程时,C++力求模仿客观世界的规律。多态性概念也是体现了现实社会中各个事物之间的联系和作用。对同一个消息,不同的对象会有不同的反应。比如一个经理要到外地出差,他会把这个消息告诉他身边的人:他的妻子、秘书、下属;这些人听到这个消息会有不同的反应:他的妻子会为他准备行李,下属会为他准备出差的材料,秘书会为他安排车票和住宿。这就体现了多态性。 多态性的概念是同样的消息被类的不同对象接收时导致完全不同行为的一种现象。消息指对类的成员函数的调用。换句话说,每个不同的对象可以以适合自己的方式去响应对同一个成员函数的调用。简单地讲,多态性就是一种实现“一种接口,多种方法”的技术,是面向对象程序设计的重要特性。 /sundae_meng * 9.1.1 多态性的实现方法 同一段代码,当用不同的对象去调用时,该代码具有不同的功能,这称为多态性。C++提供的多态性分为静态多态性(编译时多态)和动态多态性(运行时多态)。静态多态性是一种编译时的多态,是通过重载和模板实现的。动态多态性是一种运行时的多态,其基础是数据封装和继承机制,通过继承建立类层次,并通过在基类中定义虚函数来实现多态性,即在基类和派生类中建立同名的函数,但是函数的功能是不同的。 ⑴函数重载实现多态:对同一个函数名,当用不同的实参调用时,会调用到不同的重载函数版本,因而完成不同的功能,这是一种多态性的体现。 ⑵模板实现多态:模板是一类函数或类的样板,通过用不同的模板实参调用模板,同一个名字可生成不同的具体函数或具体类,从而实现不同的功能,这也是一种多态性的体现。 ⑶虚函数实现多态:通过动态束定机制,使相同的函数调用代码可能调用不同的类(基类或派生类)的虚函数,从而完成不同的功能,这又是一种多态性的体现。 /sundae_meng * 9.1.2 静态多态性和动态多态性 编译时多态通过静态联编实现,运行时多态通过动态联编实现。 1 联编 在面向对象程序设计中,联编(binding)的含义是把一个函数名与其实现的代码联系在一起,即主调函数代码必须与被调函数代码连接起来。 按照联编所在的阶段,联编分为静态联编(static binding) 和动态联编(dynamic binding)。 静态联编又称先期联编(early binding),是在编译时进行的,即是在编译阶段就必须确定函数名与代码间的对应关系。换句话说,主调函数和被调代码的关系早在编译时就确定了。 动态联编又称迟后联编(late binding),是在程序运行过程中根据程序运行时的需要进行的。根据对象的不同来决定调用哪个(成员)函数进行联编。在编译阶段,系统还不能确定两者的对应关系。动态多态性是与动态联编相联系的。 /sundae_meng * 静态联编的最大优点是速度快,运行时的开销仅仅是传递参数、执行函数调用、清除栈等。不过,程序员必须预测在每一种情况下,在所有的函数调用中,将要使用哪些对象。这不仅具有局限性,有时也是不可能的。 动态联编的问题显然是执行效率。这必须由代码本身在运行时刻推测调用哪个函数,然后再调用它。有些语言,如Smalltalk,仅使用动态联编。仅用动态联编大大加强了语言的功能,但速度浪费也很严重。ANSI C只使用静态联编,结果是速度快但灵活性不够。 /sundae_meng * 2 静态多态性 在没有类层次的场合,使用函数重载的方式实现静态多态性。各个重载函数名称相同,但参数表应在参数个数、类型和次序上有所不同。编译器根据参数表来识别各个重载函数。根据参数表,系统在编译时就完成静态联编的过程。关于没有类层次的函数重载实现多态的例子前面已经介绍,这里不再赘述。 在建立了类层次的场合,各个类可以有名字和参数表相同的成员函数。图9.1显示出单继承建立的类层次。Student类描述学生的特征。派生类Smallstudent描述小学
您可能关注的文档
最近下载
- 电大一网一《网络安全技术》形考任务二(实验4、5、6,三选一,权重25%,需辅导教师评阅)作业2.doc VIP
- BG-V3-R36-2011-0002 整车操纵行程测量报告-V2.docx VIP
- qgroundcontrol中文手册完整版.pdf VIP
- BG-V3-R38-2011-0001 整车人机工程参数测量(H点及坐姿)及前排座椅的运动分析测绘报告-V2.docx VIP
- 小学高年段单元整合教学研究结题报告.pdf VIP
- 2022年铁路电务系统(信号)竞赛考试题库(含答案).pdf VIP
- 高考化学 化学工艺流程.pdf VIP
- A160对标车模态试验分析报告.pdf VIP
- 减肥药的研究现状.doc VIP
- BG-V3-D10-2011-0001 动力系统描述报告.docx VIP
文档评论(0)