网站大量收购独家精品文档,联系QQ:2885784924

编译器设计与实现PPT课件5_多态.pptVIP

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译器设计与实现PPT课件5_多态

编译器的设计与实现 ----多态 制作: 张 云 时间:2008-04 加入多态 目标: 在继承的基础上增加多态的支持。 问题:什么是多态? 从字面上来理解,“多种形态”,即,同样的消息被不同类型的对象接受时导致的完全不同的行为。 多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。 多态性在C++中通过虚函数(virtual function)来实现。 示例 示例 支持多态需要的内容 1 虚函数应该如何运行? 2 如何实现? 3 对应的目标代码? 虚函数应该如何运行 虚函数应该如何运行 Void foo(shape s) { s.draw();// ??_draw(s) } 问题的关键在于:在main()函数中虽然可以保留不同的参数对象的信息;但是在foo()函数中,接收的参数是shape类型的,在执行s.draw();语句的时候如何能够判断出来应该调用哪一个类成员函数呢?(回想一下以前学过的知识,能解决找个问题吗?注意:子类对象可以很容易的被“裁减”成父类对象!) 问题? 多态性体现在允许将子类类型的指针赋值给父类类型的指针,但是仍旧调用子类定义的操作。(与继承的比较) 也就是说,父类指针可以指向不同的子类对象;根据指向对象的真正类型的不同调用不同的操作。而只能在运行的时候才能去判断到底该指针指向的对象的类型。(思考:为什么编译的时候不能判断出来?) 问题:如何在运行时判定当前对象的指针所指的对象类型? 解决 关键字virtual ? 表示与普通成员函数的不同 Vitual table ? 记录类中所有虚函数的入口地址;根据函数地址调用正确的函数 Vpointer(vptr) ? 指向虚函数表,从而可以在运行的时候查找虚函数代码的地址。在给类对象分配空间的时候需要分配这样一个指针的空间大小,用来存放虚指针 关键字virtual Virtual table vptr 为每个带有虚函数的类构造一个虚函数表,Vtable 在Vtable中按顺序存储每个虚函数的相关信息(包括函数代码的入口地址信息) 在类中记录指向虚函数表的指针vptr 图示如下: 设计 修改符号表 对象模型 虚指针与虚表 虚表什么时候创建? 虚指针什么时候赋值? 符号表中虚指针什么时候赋值? 创建对象时,对象模型中的虚指针的内容从哪里得到? 目标代码生成 Void foo(shape s) { s.draw();// ??_draw(s) } 小结 思考 重载与多态有什么不同? Java 中多态的实现 * * Class shape { int a; virtual void draw() { a=0; cout“shape”endl; } } Class line : class shape { Void draw() { a = 1; cout“line”endl; } } Class circle : class shape { Void draw() { a = 2; cout“circle”endl; } } Void foo(shape s) { s.draw(); //cout“a=”s.aendl; } Void main() { Shape s = new shape(); shape l= new line(); shape c = new circle(); Foo(s); Foo(l); Foo(c); } Class shape { int a; virtual void draw() { a=0; cout“shape”endl; } } Class line : class shape { Void draw() { a = 1; cout“line”endl; } } Class circle : class shape { Void draw() { a = 2; cout“circle”endl; } } Void foo(shape s) { s.draw(); //cout“a=”s.aendl; } Void main() { Shape s = new shape(); shape l= new line(); shape c = new circle(); Foo(s); Foo(l); Foo(c); } 在foo()函数中,接收的参数时

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档