面向对象语言的编译ppt课件_第1页
面向对象语言的编译ppt课件_第2页
面向对象语言的编译ppt课件_第3页
面向对象语言的编译ppt课件_第4页
面向对象语言的编译ppt课件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十二章第十二章 面向对象言语的编译面向对象言语的编译本章内容本章内容概述面向对象言语的重要概念和实现技术概述面向对象言语的重要概念和实现技术以以C+言语为例,引见如何将言语为例,引见如何将C+程序翻译成程序翻译成C程序程序实践的编译器大都把实践的编译器大都把C+程序直接翻译成低级程序直接翻译成低级言语程序言语程序12.1 面向对象言语的概念面向对象言语的概念12.1.1 对象和对象类对象和对象类对象对象由一组属性和操作于这组属性的过程组成由一组属性和操作于这组属性的过程组成属性到值的映射称为对象的形状,过程称为方属性到值的映射称为对象的形状,过程称为方法法对象类对象类一类对象的总称,规范了该

2、类中对象的属性和一类对象的总称,规范了该类中对象的属性和方法,包括它们的类型和原型方法,包括它们的类型和原型对象有本人存放属性的存储单元;同一个类的对象有本人存放属性的存储单元;同一个类的对象可以共享方法的代码对象可以共享方法的代码对象类构成了面向对象言语的模块单元对象类构成了面向对象言语的模块单元下面将把术语下面将把术语“类和类和“类型看成是同义的类型看成是同义的12.1 面向对象言语的概念面向对象言语的概念12.1.2 承继承继图形对象的承继层次构造图形对象的承继层次构造GraphicalObj translate scale PolyLine translate scale length

3、ClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle 12.1 面向对象言语的概念面向对象言语的概念承继承继基类、派生类、子类、笼统类基类、派生类、子类、笼统类子类型规那么子类型规那么当某个类型的一个对象在某个输入位置被需当某个类型的一个对象在某个输入位置被需求或作为函数的前往值时,其任何子类型的求或作为函数的前往值时,其任何子类型的对象允许出如今这些地方对象允许出如今这些地方类类B B的一个对象,假设它不同时是的一个对象,假设它不同时是B B的某个真子的某个真子类的对象,那么称该对

4、象是类的对象,那么称该对象是B B的真对象,称的真对象,称B B是该对象的运转时类型是该对象的运转时类型12.1 面向对象言语的概念面向对象言语的概念12.1.2 承继承继图形对象的承继层次构造图形对象的承继层次构造GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B12.1 面向对象言语的概念面向对象言语的概念 方法选择规那么方法选择规那么假设类假设类B承继类

5、承继类A并且重写了方法并且重写了方法m,那么,那么对类对类B的对象的对象b来说来说, 即使它作为类即使它作为类A的对象运的对象运用用, 也必需运用在类也必需运用在类B中定义的方法中定义的方法m12.1 面向对象言语的概念面向对象言语的概念12.1.2 承继承继图形对象的承继层次构造图形对象的承继层次构造GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle BA12.

6、1 面向对象言语的概念面向对象言语的概念 动态绑定规那么动态绑定规那么当对象当对象o的一个方法能够被子类重新定义的一个方法能够被子类重新定义时,假设编译器不能确定时,假设编译器不能确定o的运转时类型,那的运转时类型,那么必需对该方法进展动态绑定么必需对该方法进展动态绑定 void zoom (GraphicalObj &obj, double zoom_factor, Point ¢er) obj.translate (center.x, center.y); / 将将“中心移至中心移至“点点(0, 0)obj.scale (zoom_factor); / 缩放缩放 12.1 面向对象

7、言语的概念面向对象言语的概念12.1.3 信息封装信息封装大多数面向对象言语提供了一种机制,它可用大多数面向对象言语提供了一种机制,它可用来将类的特征分成私有的和公共的来将类的特征分成私有的和公共的某些面向对象言语用不同的上下文区分作用域某些面向对象言语用不同的上下文区分作用域,如,如“在一个类中、在一个类中、“在派生类中、在派生类中、“在友在友元类中等等元类中等等由编译器来实现这些作用域规那么是简单而又由编译器来实现这些作用域规那么是简单而又明显的明显的 12.2 方法的编译方法的编译 先定义普通的图形对象类先定义普通的图形对象类GraphicalObjGraphicalObj如下如下: :

8、class GraphicalObj class GraphicalObj virtual void translate (double x_offset, virtual void translate (double x_offset, doubledouble y_offset); y_offset);virtual void scale (double factor);virtual void scale (double factor);. . . . . . / / 能够还有一些其它方法能够还有一些其它方法; ; 12.2 方法的编译方法的编译 class Point : public

9、 GraphicalObj double xc, yc; public : void translate (double x_offset, double y_offset) xc += x_offset; yc += y_offset; void scale (double factor) xc *= factor; yc *= factor;Point(double x0 = 0, double y0 = 0) xc = x0; yc = y0; void set(double x0, double y0) xc = x0; yc = y0;double x(void) return xc

10、;double y(void) return yc;double dist (Point &);12.2 方法的编译方法的编译 将一个将一个C+C+言语的类翻译成言语的类翻译成C C言语的程序段,主言语的程序段,主要任务有如下几点要任务有如下几点( (由承继引出的问题暂不思索由承继引出的问题暂不思索) )将将C+C+言语中一个类的一切非静态属性构成一个言语中一个类的一切非静态属性构成一个C C言语的构造体类型,取类的名字作为构造体类言语的构造体类型,取类的名字作为构造体类型的名字型的名字类的静态属性是该类的一切对象所共有的类的静态属性是该类的一切对象所共有的, ,该当该当翻译成翻译成C C中的

11、全局变量,但是需求改一个名字中的全局变量,但是需求改一个名字C+C+言语中类的对象声明不加翻译就成了言语中类的对象声明不加翻译就成了C C言语中言语中相应构造体类型的变量声明相应构造体类型的变量声明12.2 方法的编译方法的编译 将将C+C+言语中类的非静态方法翻译成言语中类的非静态方法翻译成C C言语的函言语的函数,对应的方法和函数的区别有下面几点:数,对应的方法和函数的区别有下面几点: 函数的名字必需在原来方法名的根底上修正函数的名字必需在原来方法名的根底上修正 函数声明添加一个形参函数声明添加一个形参thisthis 在函数体中出现的函数调用也要添加一个实参在函数体中出现的函数调用也要添

12、加一个实参 在方法中对本对象的非静态属性的访问,改成在方法中对本对象的非静态属性的访问,改成对对thisthis相应域的访问。在方法中对其它对象的相应域的访问。在方法中对其它对象的非静态属性的访问不用修正非静态属性的访问不用修正 类的静态方法在定义和调用的地方都需求改名类的静态方法在定义和调用的地方都需求改名12.2 方法的编译方法的编译 方方 法法 函函 数数 原型原型 前往类型前往类型 m( m(形参表形参表) ) 前往类型前往类型 fm(C fm(C &this, &this, 形参表形参表) )调用调用 m实参表实参表o.n实参表实参表fmthis,实参表,实参表 fno,实参表,实参

13、表 属性访问属性访问 ko.kthis.ko.k类类C的方法的方法m被翻译成函数被翻译成函数fm 12.2 方法的编译方法的编译 类类PointPoint的方法的方法translatetranslate翻译成函数翻译成函数translate_ _5Pointddtranslate_ _5Pointddvoid translate_ _5Pointdd(Point this, void translate_ _5Pointdd(Point this, double x_offset , double double x_offset , double y_offset) y_offset) thi

14、s.xc += x_offset; this.yc += y this.xc += x_offset; this.yc += y _offset;_offset; 12.3 承继的编译方案承继的编译方案图形对象的承继层次构造图形对象的承继层次构造GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle BA12.3 承继的编译方案承继的编译方案图形对象的承继层次构造图形

15、对象的承继层次构造GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 假设类假设类B直接或间接承直接或间接承继继类类A,类,类B的对象可用在的对象可用在类类A的对象可用的地方的对象可用的地方12.3 承继的编译方案承继的编译方案图形对象的承继层次构造图形对象的承继层次构造GraphicalObj translate scale PolyLine tr

16、anslate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 假设类假设类B直接或间接承直接或间接承继继类类A,类,类B的对象可用在的对象可用在类类A的对象可用的地方的对象可用的地方矩形矩形: 可作为可作为多边形运用多边形运用12.3 承继的编译方案承继的编译方案图形对象的承继层次构造图形对象的承继层次构造GraphicalObj translate scale PolyLine translate scale lengthClosedG

17、raphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 编译器必需能以一种有编译器必需能以一种有效的方式产生类效的方式产生类B对象的对象的A视图视图矩形矩形: 可作为可作为多边形运用多边形运用12.3 承继的编译方案承继的编译方案图形对象的承继层次构造图形对象的承继层次构造GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale area

18、PolyGon areaRectanglearea Triangle B矩形矩形A 因类因类A的虚方法可在类的虚方法可在类B中被重写,又需中被重写,又需B视图视图可以有效地从可以有效地从A视图恢复视图恢复矩形矩形: 可作为可作为多边形运用多边形运用12.3 承继的编译方案承继的编译方案图形对象的承继层次构造图形对象的承继层次构造GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea T

19、riangle B矩形矩形A 因类因类A的虚方法可在类的虚方法可在类B中被重写,又需中被重写,又需B视图视图可以有效地从可以有效地从A视图恢复视图恢复矩形矩形: 要能恢要能恢复矩形信息复矩形信息12.3 承继的编译方案承继的编译方案图形对象的承继层次构造图形对象的承继层次构造GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 需求编译器为类的对象需求

20、编译器为类的对象设计具有某种灵敏的构造设计具有某种灵敏的构造矩形矩形: 要能恢要能恢复矩形信息复矩形信息12.3 承继的编译方案承继的编译方案#include “graphicalobj.h#include “list.h #include “point.hclass PolyLine : public GraphicalObj list points; public:void translate (double x_offset, double y_offset);virtual void scale (double factor);virtual double length (void);

21、#include “polyline.hclass Rectangle : public PolyLine double side1_length, double side2_length; public :Rectangle (double s1_len, double s2_len, double x_angle = 0);void scale (double factor);double length (void);12.3.1 单一承继的编译方案单一承继的编译方案12.3 承继的编译方案承继的编译方案void zoom (GraphicalObj &obj, double zoom_f

22、actor, Point ¢er) obj.translate (center.x, center.y); / 将将“中心移至中心移至“点点(0, 0)obj.scale (zoom_factor); / 缩放缩放假设函数假设函数zoom作用于矩形,那么作用于矩形,那么zoom的体必需的体必需调用调用Rectangle的缩放函数,而不是的缩放函数,而不是PolyLine甚至甚至GraphicalObj的缩放函数的缩放函数 12.3 承继的编译方案承继的编译方案编译器怎样有效地实现动态绑定?编译器怎样有效地实现动态绑定?编译器为每个类建立一个方法表,它们包含该编译器为每个类建立一个方法表

23、,它们包含该类或它的超类中一切定义为类或它的超类中一切定义为virtualvirtual的方法的的方法的入口入口每个对象在每个对象在C C程序中有对应的构造体,再为这种程序中有对应的构造体,再为这种构造体添加一个域,该域是方法表的指针构造体添加一个域,该域是方法表的指针承继类方法表的产生承继类方法表的产生首先拷贝基类的方法表,被重新定义的方法由首先拷贝基类的方法表,被重新定义的方法由新的定义覆盖新的定义覆盖然后把新引入的方法追加到这张表上然后把新引入的方法追加到这张表上12.3 承继的编译方案承继的编译方案图形对象的不同子类的方法表图形对象的不同子类的方法表GraphicalObjPolyLi

24、neRectangle length_RA scale_RA translate_PL length_PL scale_PL translate_PL scale_GO translate_GO12.3 承继的编译方案承继的编译方案Rectangle的对象表示的对象表示 length_RA scale_RA translate_PL side2_length side1_length points 视图:视图: GraphicalObj PolyLine RectangleRectangle 方法表方法表12.3 承继的编译方案承继的编译方案12.3.2 反复承继的编译方案反复承继的编译方案反

25、复承继对言语定义和编译器设计来说,都反复承继对言语定义和编译器设计来说,都具有很大的挑战性具有很大的挑战性B1和和B2之间的冲突与矛盾之间的冲突与矛盾反复承继反复承继可以有多个实例可以有多个实例只能有一个实例只能有一个实例AB1B2C12.3 承继的编译方案承继的编译方案B1和和B2之间的冲突与矛盾之间的冲突与矛盾这是言语定义问题,处理方法:这是言语定义问题,处理方法:将将B1定义为主要后代,冲突处理优先于定义为主要后代,冲突处理优先于B1言语允许重新命名被承继的特征言语允许重新命名被承继的特征言语提供显式地手段来处理冲突言语提供显式地手段来处理冲突B1:n或或B2:n 实现起来并无什么困难,

26、实现起来并无什么困难,只涉及到编译器符号表的只涉及到编译器符号表的组织和管理问题组织和管理问题AB1B2C12.3 承继的编译方案承继的编译方案反复承继的多个实例反复承继的多个实例附加附加B1AA附加附加B2附加附加C附加附加B1A附加附加B2附加附加C反复承继的单个实例反复承继的单个实例下面两种方式都有运用,仅讨论前者下面两种方式都有运用,仅讨论前者12.3 承继的编译方案承继的编译方案独立的反复承继的编译方案独立的反复承继的编译方案承继类承继类C C的对象包含基类的对象包含基类B1B1和和B2B2的完好拷贝的完好拷贝 来自基类的承继是相互独来自基类的承继是相互独立的立的B1B2附加附加C独立的反复承继时的独立的反复承继时的对象构造程序视图对象构造程序视图12.3 承继的编译方案承继的编译方案反复承继在下述情况导致冲突和二义反复承继在下述情况导致冲突和二义当多实例的特征被用于访问、当多实例的特征被用于访

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论