第讲多态性与虚函数教材.ppt

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
面向对象方法 */26 * 面向对象方法 6.1 什么是多态性 多态(polymorphism)是OO的最核心的体现。所谓多态性是指发出同样的消息,被不同的对象接受时导致完全不同的行为。 多态性是OO的关键技术。不支持多态性,则不能称为OO语言,只能称之为object-based(基于对象)的语言(如:Visual Basic)。 参考文献:C++多态技术,程序员2004年第2期,p.96。 */26 * 面向对象方法 直观地说,多态性是指用一个名字定义不同的函数,这些函数执行不同的功能,这样就可以使用相同的调用方式来调用这些具有不同功能的同名函数。 C++中的两类多态性: 静态多态性:编译时的多态性。 动态多态性:运行时的多态性。 */26 * 面向对象方法 6.2 静态多态性的例子 静态多态是一种编译时的多态性,即要调用哪一个函数在程序执行前的编译时,就得到确定(通过函数名和参数列表)。静态多态性的实现手段:函数重载(overloading)。 C++既支持静态多态(默认),又支持动态多态(需使用关键字virtual)。 */26 * 面向对象方法 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; } */26 * 面向对象方法 Point Disp() : void Point() ~Point() Circle Disp() : void Circle() ~Circle() Point p; Circle c; p.Disp(); c.Disp(); 在编译时,根据对象名,就可确定调用哪一个成员函数,所以这也是静态多态 */26 * 面向对象方法 动态多态性的例子 Point virtual Disp() Point() ~Point() Circle Disp() Circle() ~Circle() Point p; Circle c; p.Disp(); c.Disp(); Point pRef1 = p; Point pRef2 = c; pRef1.Disp(); pRef2.Disp(); Its a point Its a Circle Its a point Its a Circle 动态多态 */26 * 面向对象方法 Point virtual Disp() Point() ~Point() Circle Disp() : void Circle() ~Circle() void Test(Point s); Point pt; Circle c; Test(pt); Test(c); void Test(Point s) { s.Disp(); } */26 * 面向对象方法 函数调用的过程 程序调用代码时,将使用哪个可执行代码块呢?编译器负责回答这个问题,其主要过程如下: 在编译时,编译器对各个文件中的函数进行编译后,每个函数均有代码地址(入口); 函数被编译后放在程序代码区中; 链接程序把对函数的调用和被调函数的入口联接起来(这称为绑定,Binding) 。 */26 * 面向对象方法 早绑定(early binding) 在C语言中,因为不支持重载,所以每个函数名都对一个不同的函数代码,因此binding非常简单,这在编译时就能确定。 在C++中,由于函数重载的缘故,这个任务更复杂。编译器必须通过函数名和参数列表的组合才能确定调用哪个函数。这种情况在编译时也能确定。 以上在编译时就能确定的binding被称为static binding或early binding。 */26 * 面向对象方法 晚绑定(late binding) 在C++中,虚函数的使用使得binding更加困难。就像前面代码中演示的那样,调用哪个函数在编译时不能确定,因为编译器不能确定用户将选择哪个类型的对象。 此时,编译器必须生成能能够在程序运行时选择调用哪个函数的代码,这被称为dynamic binding或late binding。 */26 * 面向对象方法 编译器如何确定使用哪种binding 前面讲过C只支持early binding,而C++及支持early binding,又支持late binding,那么C++的编译器是如何确定使用的是哪种binding方法呢? 编译器对于所有非v

文档评论(0)

w5544434 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档