- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
讲多态性与虚函数
第六章 多态性与虚函数 什么是多态性 静态多态性 函数调用的过程 静态多态性的实现原理 upcasting的局限性 虚函数 虚函数的使用方法和实现原理 动态多态性 静态绑定 VS 动态绑定 虚函数说明 动态绑定的实现 上机实验 *面向对象方法 在本章中,将介绍以下主要内容: 什么是多态性; 多态的例子; 虚函数; 纯虚函数和抽象类。 多态性(polymorphism)是OO的最核心的体现。所谓多态性是指发出同样的消息,被不同的对象接受时导致完全不同的行为。 多态性是OO的关键技术。不支持多态性,则不能称为OO语言,只能称之为object-based(基于对象)的语言(如:Visual Basic)。 直观地说,多态性是指用一个名字定义不同的函数,这些函数执行不同的功能,这样就可以使用相同的调用方式来调用这些具有不同功能的同名函数。 C++中的两类多态性(p.199): 静态多态性:编译时的多态性。 动态多态性:运行时的多态性。 它是一种编译时的多态性:即函数的调用是根据调用时实参类型和个数,在程序执行前,即编译时刻就能确定调用哪一个函数。 C语言只支持这种静态的多态性,不支持动态的多态性。C++既支持静态多态性(默认),又支持动态多态性(需使用关键字virtual)。 静态多态性的实现手段:重载(包括函数重载和运算符重载)。 void Disp(int x); void Disp(double x); int main(){ Disp(3); Disp(6.3); return 0; } void Disp(int x){ cout Its a integer, Disp(int x) endl; } void Disp(double x){ cout Its a double, Disp(double x) endl; } Point Disp() : void Point() ~Point() Circle Disp() : void Circle() ~Circle() Point p; Circle c; p.Disp(); c.Disp(); 在编译时,根据对象名,就可确定调用哪一个成员函数,所以这也是静态的多态性。 下面将函数编译的原理和函数被调用的过程作以简单介绍: 在编译时,编译器对各个文件中的函数进行编译后,每个函数均有代码地址(入口); 函数被编译后放在程序代码区中; 链接程序把对被调函数的调用和被调函数的入口联接起来(这称为绑定,Binding) 。 静态多态性是通过静态绑定实现的。 静态绑定:程序在生成可执行代码的同时,已经“永远”地让函数调用语句指向了被调函数的代码。 我们前面讲过的绑定方式均为静态绑定,在C++中只有使用了关键字virtual才有可能是动态绑定(使用virtual关键字既是告诉编译器要使用动态绑定,但这要满足一定的条件)。 表现:当覆盖发生时,使用upcasting,虽然基类的指针能够指向派生类的对象,但是由于是静态绑定,所以程序的结果只能是基类的成员函数。 欲解决的问题:希望根据pRef所指向的实参对象,而不是指针或引用pRef的类型调用函数。 Point p; Circle c; Point pRef1 = p; Point pRef2 = c; pRef1-Disp(); pRef2-Disp(); Point Disp() : void Point() ~Point() Circle Disp() : void Circle() ~Circle() Point p; Circle c; p.Disp(); c.Disp(); Point *pRef = p; pRef-Disp(); pRef = c; pRef-Disp(); Its a point Its a Circle Its a point Its a point Press any key to continue 向上映射 C++使用虚函数解决上述问题。其语法为:成员函数声明前加virtual(如:virtual void Disp();)。 继承、覆盖、upcasting、虚函数的结合可使C++支持运行时的多态性。即在基类中定义通用的接口,在派生类中定义具体的实现方法(覆盖),也就是常说的“同一接口,多种方法”。 从基类继承来的虚函数,在派生类中仍是虚函数。 虚函数使用方法: 声明基类某成员函数为虚函数 ; 在派生类中覆盖基类中的虚函数; 声明基类指针标识符或引用指向类族中的对象; 通过该指针或引用调用虚函数; 虚函数实现原理:通过动态绑定(late binding、滞后绑定)实现在
您可能关注的文档
- 计算机组成原理REVIEW.ppt
- 计算机组成原理(版)3.ppt
- 计算机系统版.ppt
- 计算机组成原理七指令系统.ppt
- 计算机组成技术一pp.ppt
- 计算机组成技术四.ppt
- 计算机系统结构(讲).ppt
- 计算机组成指令系统.ppt
- 计算机组成原理清华大学初步.ppt
- 计算机系统的安装及其相关知识初步.PPT
- 白天晚上教学课件.ppt
- 2025年山东菏泽市牡丹区中医医院引进急需紧缺专业技术人才30人笔试模拟试题参考答案详解.docx
- 2025年山东菏泽市牡丹区中医医院引进急需紧缺专业技术人才30人笔试模拟试题带答案详解.docx
- 2025年山东菏泽市牡丹区中医医院引进急需紧缺专业技术人才30人笔试模拟试题及参考答案详解.docx
- 2025年山东菏泽市牡丹区中医医院引进急需紧缺专业技术人才30人笔试模拟试题及参考答案详解一套.docx
- 2025年山东菏泽市牡丹区中医医院引进急需紧缺专业技术人才30人笔试模拟试题及完整答案详解1套.docx
- 2025年山东菏泽市牡丹区中医医院引进急需紧缺专业技术人才30人笔试模拟试题及参考答案详解1套.docx
- 2025年山东菏泽市事业单位招聘急需紧缺岗位目录(第一批)笔试模拟试题参考答案详解.docx
- 2025年山东菏泽市牡丹区中医医院引进急需紧缺专业技术人才30人笔试模拟试题及答案详解1套.docx
- 画西瓜教学课件.ppt
文档评论(0)