编译器设计与实现PPT课件4_继承.pptVIP

  1. 1、本文档共40页,可阅读全部内容。
  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课件4_继承

编译器的设计与实现 ----继承 制作: 张 云 时间:2008-03 课程描述 目标:编译器的设计与实现 方法: 给定语言特性,限定目标机器模型,实现该语言的编译器; 添加新的语言特性,对编译器做相应的修改。 语言 进一步的扩展 加入继承 目标: 在对象的基础上增加继承的支持。 问题:什么是继承? 通过继承现有类型的性质,创建新的数据类型,而不会影响原有数据类型。 代码示例 class simple { int x; void Init(int a) { x = a;} } class complex :simple { int y; void InitC(int a , int b) { Init(a); y = b; } } 支持继承会遇到什么问题? 子类对父类有哪些扩展? 成员变量的扩展,成员函数的扩展 子类对象的操作有哪些需要特殊处理的地方? (对子类本身的成员变量or成员函数的访问) 对父类成员变量的访问 对父类成员函数的调用 子类对父类的扩展 Class A { int a;} Class B : class A { int b; int c;} Class C : class A { int d; } Class D : class B { int e; } 对象模型 s是simple类的一个对象 c是complex类的一个对象 子类对象支持的操作 子类对象支持的操作 class simple { int x; void Init(int a) { x = a;} } class complex : class simple { int y; void InitC(int a , int b) { Init(a); y = b; } } 子类对象的创建 问题:子类对象的大小是多少? 通过前面的对象模型可以看出,子类对象创建的时候需要首先构造出相应的父类对象 子类对象需要占用的空间=父类对象的大小+子类扩展部分的大小 成员变量的访问 通过前面的对象模型可以看出 ,访问成员变量的方式并没有变化: 对象地址+成员变量的偏移 问题: 父类的成员变量和子类的成员变量偏移的关系? 如何计算每一个可访问的成员变量的偏移地址? 成员变量的访问 设计:首先是父类的成员变量,然后是子类扩展的成员变量。 问题的解决: 子类对象中父类成员变量的偏移量与父类对象中成员变量的偏移一致; 计算子类成员变量的偏移时,首先将偏移量初值设为父类大小,然后每遇到一个新的成员变量,其偏移为当前的偏移量+1 成员函数调用 从对象模型中可以看出,我们可以将一个子类对象”裁减“成一个父类对象,因此,直接将子类对象的对象地址传给父类成员函数就可以操作子类对象中“内含”的父类对象。 我们已经知道,类的成员函数对应的目标代码中,都对成员函数名做了特殊的变化,一般来说通过类名信息和函数名信息共同构造一个唯一的标识名。 例如: Simple::Init() {} ? simple_Init() {} Complex::InitC() {} ? Complex_InitC() {} 成员函数调用 问题:在子类对象调用成员函数时,如何正确构造出正确的函数名? 例如: void InitC(int a , int b) { Init(a); y = b; } 转化为 void complex_InitC(complex this, int a, int b) { simple_Init(this,a); this.y = b; } 成员函数调用 解决:顺序查找 每个类的符号表中维护着自己的 成员函数列表; 遇到成员函数调用的时候,首先在自己的函数列表中查找相应的函数名, 找到,给函数名添加本类类名即可。 否则,在父类的函数列表中查找。 找到,给函数名添加父类类名。 否则,为全局函数,在全局函数表中查找。 新问题:如何找到父类? 如何实现? 问题:对象在操作过程中所需要的信息(需要哪些信息?)从哪里获得? 子类的定义 子类对象声明 子类对象的创建 子类对象的操作 如何实现 子类对象操作 符号表 中间形式 目标代码 中间形式 比较:没有继承时 符号表 比较:没有继承时 目标代码生成 对象创建 为对象在堆中分配空间 目标机器指令系统中增加了new指令 主要完成在堆上按照对象的需要分配空间的工作 P = new Point(); 生成代码 NEW p引用地址,Point 子类对象创建 不同:子类

文档评论(0)

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

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

1亿VIP精品文档

相关文档