编译器的设计与实现ppt课件4继承

编译器的设计与实现ppt课件4继承

ID:33437217

大小:142.50 KB

页数:40页

时间:2018-05-25

编译器的设计与实现ppt课件4继承_第1页
编译器的设计与实现ppt课件4继承_第2页
编译器的设计与实现ppt课件4继承_第3页
编译器的设计与实现ppt课件4继承_第4页
编译器的设计与实现ppt课件4继承_第5页
资源描述:

《编译器的设计与实现ppt课件4继承》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、编译器的设计与实现 ----继承制作:张云时间:2008-03课程描述目标:编译器的设计与实现方法:给定语言特性,限定目标机器模型,实现该语言的编译器;添加新的语言特性,对编译器做相应的修改。语言一个用于教学的编译运行环境简化的C函数调用If语句While语句赋值语句表达式数组声明语句控制语句…进一步的扩展简化的C++简单的C对象继承多态异常处理垃圾回收……加入继承目标:在对象的基础上增加继承的支持。问题:什么是继承?通过继承现有类型的性质,创建新的数据类型,而不会影响原有数据类型。代码示例classsimple{intx;voidInit(inta){x=a;

2、}}classcomplex:simple{inty;voidInitC(inta,intb){Init(a);y=b;}}voidmain(){complexc;c.Init(3);c.x=5;c.InitC(1,4);}支持继承会遇到什么问题?子类对父类有哪些扩展?成员变量的扩展,成员函数的扩展子类对象的操作有哪些需要特殊处理的地方?(对子类本身的成员变量or成员函数的访问)对父类成员变量的访问对父类成员函数的调用子类对父类的扩展ClassA{inta;}ClassB:classA{intb;intc;}ClassC:classA{intd;}ClassD:

3、classB{inte;}AaBabcCadDabce堆对象模型s是simple类的一个对象c是complex类的一个对象xy栈s引用地址对象地址cx子类对象支持的操作子类对象调用成员函数访问成员变量对象创建访问父类成员变量访问自己的成员变量调用自己的成员函数访问父类成员函数子类对象支持的操作classsimple{intx;voidInit(inta){x=a;}}classcomplex:classsimple{inty;voidInitC(inta,intb){Init(a);y=b;}}voidmain(){complexc;c=newcomplex()

4、;c.Init(3);c.x=5;c.y=7;c.InitC(1,4);}子类对象的创建问题:子类对象的大小是多少?通过前面的对象模型可以看出,子类对象创建的时候需要首先构造出相应的父类对象子类对象需要占用的空间=父类对象的大小+子类扩展部分的大小xyc成员变量的访问通过前面的对象模型可以看出,访问成员变量的方式并没有变化:对象地址+成员变量的偏移问题:父类的成员变量和子类的成员变量偏移的关系?如何计算每一个可访问的成员变量的偏移地址?堆成员变量的访问设计:首先是父类的成员变量,然后是子类扩展的成员变量。问题的解决:子类对象中父类成员变量的偏移量与父类对象中成员

5、变量的偏移一致;计算子类成员变量的偏移时,首先将偏移量初值设为父类大小,然后每遇到一个新的成员变量,其偏移为当前的偏移量+1classsimple{intx;//偏移为0}classcomplex:simple{inty;//偏移为1}xy栈cComplexc;成员函数调用从对象模型中可以看出,我们可以将一个子类对象”裁减“成一个父类对象,因此,直接将子类对象的对象地址传给父类成员函数就可以操作子类对象中“内含”的父类对象。我们已经知道,类的成员函数对应的目标代码中,都对成员函数名做了特殊的变化,一般来说通过类名信息和函数名信息共同构造一个唯一的标识名。例如:S

6、imple::Init(){}simple_Init(){}Complex::InitC(){}Complex_InitC(){}xy对象地址成员函数调用问题:在子类对象调用成员函数时,如何正确构造出正确的函数名?例如:voidInitC(inta,intb){Init(a);y=b;}转化为voidcomplex_InitC(complexthis,inta,intb){simple_Init(this,a);this.y=b;}成员函数调用解决:顺序查找每个类的符号表中维护着自己的成员函数列表;遇到成员函数调用的时候,首先在自己的函数列表中查找相应的函数

7、名,找到,给函数名添加本类类名即可。否则,在父类的函数列表中查找。找到,给函数名添加父类类名。否则,为全局函数,在全局函数表中查找。新问题:如何找到父类?如何实现?问题:对象在操作过程中所需要的信息(需要哪些信息?)从哪里获得?子类的定义子类对象声明子类对象的创建子类对象的操作如何实现子类定义类信息类成员函数汇编代码子类对象操作类名父类信息成员函数列表成员变量列表需要的内存空间符号表中间形式目标代码中间形式ComplexSimpleyInitC类声明classComplex:classSimple{inty;voidInitC(inta,intb){Init(a

8、);y=b;}}ab语句

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。