- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c面向对象OOPC6-1
第6章 多态和虚函数 (Polymorphism and virtual function) 本章内容 6.1 静态联编和动态联编 6.2 虚函数 6.3 纯虚函数和抽象类 6.4 运算符重载 6.1 静态联编和动态联编 静态联编 联编是指一个计算机程序自身彼此关联的过程。联编在编译和连接时进行,称为静态联编。 动态联编 联编在程序运行时进行,称为动态联编,或称动态绑定,又叫晚期联编。 动态联编 在编译、链接过程中无法解决的联编问题,要等到程序开始运行之后再来确定。动态联编的主要优点是提供了更好的编程灵活性、问题抽象性和程序易维护性,但是与静态联编相比,函数调用速度慢,因为动态联编需要在程序运行过程中搜索以确定函数调用(消息)与程序代码(方法)之间的匹配关系。 动态联编由虚函数来实现。 6.2 虚函数(Virtual Functions) 虚函数的定义和使用 虚函数的特性 虚函数允许程序员在基类中定义,在其每一个派生类中重新定义。 关键字virtual只能在函数声明时使用。 虚函数可以像其他函数一样被继承。 当基类中的虚函数在派生类中被重新改变时,称为overridden,而如果此时该函数不是虚函数,则称为redefinition。 2.使用虚函数 当在类的层次结构中声明了虚函数以后,并不一定就能实现运行时的多态性,必须合理调用虚函数才能实现动态联编。 只有在程序中使用基类类型的指针或引用调用虚函数时,系统才以动态联编方式实现对虚函数的调用。 如果使用对象名调用虚函数,系统仍然以静态联编方式完成对虚函数的调用,也就是说,用哪个类说明的对象,就调用在哪个类中定义的虚函数。 3.虚函数与函数重载的关系 在派生类中重新定义基类中的虚函数,是函数重载的另一种形式。 但虚函数与一般重载函数有区别,具体区别在于: (1) 重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;而虚函数是根据对象的不同去调用不同类的虚函数。 (2) 重载函数在编译时表现出多态性,是静态联编;虚函数则在运行时表现出多态性,是动态联编。 (3) 构造函数可以重载,析构函数不能重载;正好相反,构造函数不能定义为虚函数,析构函数能定义为虚函数。 (4) 重载函数只要求函数有相同的函数名,并且重载函数是在相同作用域中定义的名字相同的不同函数;而虚函数不仅要求函数名相同,而且要求函数的签名、返回类型也相同。 (5) 重载函数可以是成员函数或友元函数;而虚函数只能是非静态成员函数。 4.虚函数的特性 由虚函数实现的动态多态性:同一类中不同的对象对同一函数调用作出不同的响应。 在派生类中重新定义函数时,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。 6.3 纯虚函数和抽象类 纯虚函数 抽象类 抽象类的应用 1.纯虚函数 纯虚函数是一种特殊的虚函数,它是被标明为不具体实现的虚函数,从语法上讲,纯虚函数是在虚函数的后面加上“=0”,表示该虚函数无函数体, 这里的“=”并非赋值运算。 在一个类中如果虚函数不可能实现的太具体,则可以定义为纯虚函数。 纯虚函数为类的继承提供了连续的接口。 注意:在构造函数和析构函数中不能调用纯虚函数。 只有虚函数才可能是纯虚函数 即非虚函数或普通函数都不能定义成纯虚函数。 2.抽象类 如果一个类中至少有一个纯虚函数,则这个类为抽象类。 如果派生类中没有再对基类中的纯虚函数进行重定义,则派生类也是抽象类。 不能定义抽象类的对象,但可以定义抽象类的指针和引用。 抽象类一般作为接口来隐藏实现细节并一般作为基类。 抽象基类一般只有公有成员,这些为其派生类所共享。 在类层次结构中,尽可能地为类设计一个统一的公共接口(界面),即采用抽象基类设计方法。一个统一的公共接口必须要经过精心的分析和设计。 DiscountSale::DiscountSale( ) : Sale( ), discount(0) { } DiscountSale::DiscountSale(double the_price, double the_discount) : Sale(the_price), discount(the_discount) { } double DiscountSale::bill( ) const { double fraction = discount/100; return (1 - fraction)*price; } int main( ) { Sale simple(10.00);//One item at $10.00. Discoun
您可能关注的文档
最近下载
- 脑室外引流管护理.pptx VIP
- 【高一】高中心理健康《1生涯拍卖会》 省级优质课.pptx VIP
- 【廉政党课】全面从严治党-抓好党风廉政建设.pptx VIP
- 17GL401 综合管廊热力管道敷设与安装.pptx VIP
- 病原微生物第3章消毒灭菌与病原微生物实验室生物安全习题与答案.docx VIP
- 精益生产、精益工具与精益思想.ppt VIP
- 电子节温器工作原理及电子警察施工安装说明.doc VIP
- 第五讲贯通测量.pdf VIP
- xe82-2000午山风电场风机定检作业指导书一年3月15日部分内容改动.pdf VIP
- 任务一+感受物联网+课件-2025-2026学年陕教版(2024)初中信息科技八年级上册.pptx VIP
文档评论(0)