书签 分享 收藏 举报 版权申诉 / 38
上传文档赚钱

类型面向对象语言的编译课件.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4941491
  • 上传时间:2023-01-27
  • 格式:PPT
  • 页数:38
  • 大小:529KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《面向对象语言的编译课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    面向 对象 语言 编译 课件
    资源描述:

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

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

    3、 scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle 12.1 面向对象语言的概念面向对象语言的概念继承继承 基类、派生类、子类、抽象类基类、派生类、子类、抽象类 子类型规则子类型规则当某个类型的一个对象在某个输入位置被需要或作当某个类型的一个对象在某个输入位置被需要或作为函数的返回值时,其任何子类型的对象允许出现为函数的返回值时,其任何子类型的对象允许出现在这些地方在这些地方 类类B的一个对象,若它不同时是的一个对象,若它不同时是B的某个真子的某个真子类的

    4、对象,那么称该对象是类的对象,那么称该对象是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.1

    6、 面向对象语言的概念面向对象语言的概念 动态绑定规则动态绑定规则当对象当对象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 面向对象语言的概念面向对象语言的概念12.

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

    8、id translate(double x_offset,double y_offset);virtual void scale(double factor);./可能还有一些其它方法可能还有一些其它方法;12.2 方法的编译方法的编译 class Point:public 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(dou

    9、ble x0=0,double y0=0)xc=x0;yc=y0;void set(double x0,double y0)xc=x0;yc=y0;double x(void)return xc;double y(void)return yc;double dist(Point&);12.2 方法的编译方法的编译 将一个将一个C+语言的类翻译成语言的类翻译成C语言的程序段,主语言的程序段,主要工作有如下几点要工作有如下几点(由继承引出的问题暂不考虑由继承引出的问题暂不考虑)将将C+语言中一个类的所有非静态属性构成一语言中一个类的所有非静态属性构成一个个C语言的结构体类型,取类的名字作为结构语言

    10、的结构体类型,取类的名字作为结构体类型的名字体类型的名字 类的静态属性是该类的所有对象所共有的类的静态属性是该类的所有对象所共有的,应应当翻译成当翻译成C中的全局变量,但是需要改一个名中的全局变量,但是需要改一个名字字 C+语言中类的对象声明不加翻译就成了语言中类的对象声明不加翻译就成了C语语言中相应结构体类型的变量声明言中相应结构体类型的变量声明12.2 方法的编译方法的编译 将将C+语言中类的非静态方法翻译成语言中类的非静态方法翻译成C语言的语言的函数,对应的方法和函数的区别有下面几点:函数,对应的方法和函数的区别有下面几点:函数的名字必须在原来方法名的基础上修改函数的名字必须在原来方法名

    11、的基础上修改 函数声明增加一个形参函数声明增加一个形参this 在函数体中出现的函数调用也要增加一个实参在函数体中出现的函数调用也要增加一个实参 在方法中对本对象的非静态属性的访问,改成对在方法中对本对象的非静态属性的访问,改成对this相应域的访问。在方法中对其它对象的非静态相应域的访问。在方法中对其它对象的非静态属性的访问不必修改属性的访问不必修改 类的静态方法在定义和调用的地方都需要改名类的静态方法在定义和调用的地方都需要改名12.2 方法的编译方法的编译 方方 法法 函函 数数 原型原型 返回类型返回类型 m(形参表形参表)返回类型返回类型 fm(C&this,形参表形参表)调用调用

    12、m(实参表)实参表)o.n(实参表)实参表)fm(this,实参表)实参表)fn(o,实参表)实参表)属性访问属性访问 ko.kthis.ko.k类类C的方法的方法m被翻译成函数被翻译成函数fm 12.2 方法的编译方法的编译 类类Point的方法的方法translate翻译成函数翻译成函数translate_ _5Pointddvoid translate_ _5Pointdd(Point this,double x_offset,double y_offset)this.xc+=x_offset;this.yc+=y _offset;12.3 继承的编译方案继承的编译方案图形对象的继承层次

    13、结构图形对象的继承层次结构GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle BA12.3 继承的编译方案继承的编译方案图形对象的继承层次结构图形对象的继承层次结构GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate sca

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

    15、类B直接或间接继承直接或间接继承类类A,类类B的对象可用在的对象可用在类类A的对象可用的地方的对象可用的地方矩形矩形:可作为可作为多边形使用多边形使用12.3 继承的编译方案继承的编译方案图形对象的继承层次结构图形对象的继承层次结构GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 编译器必须能以一种有编译器必须能以一种有效的方式产生类效的方式产生类

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

    17、多边形使用12.3 继承的编译方案继承的编译方案图形对象的继承层次结构图形对象的继承层次结构GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 因类因类A的虚方法可在类的虚方法可在类B中被重写,又需中被重写,又需B视图视图能够有效地从能够有效地从A视图恢复视图恢复矩形矩形:要能恢要能恢复矩形信息复矩形信息12.3 继承的编译方案继承的编译方案图形对象

    18、的继承层次结构图形对象的继承层次结构GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 需要编译器为类的对象需要编译器为类的对象设计具有某种灵活的结构设计具有某种灵活的结构矩形矩形:要能恢要能恢复矩形信息复矩形信息12.3 继承的编译方案继承的编译方案#include“graphicalobj.h”#include“list.h”#include“p

    19、oint.h”class PolyLine:public GraphicalObj list points;public:void translate(double x_offset,double y_offset);virtual void scale(double factor);virtual double length(void);#include“polyline.h”class Rectangle:public PolyLine double side1_length,double side2_length;public:Rectangle(double s1_len,double

    20、 s2_len,double x_angle=0);void scale(double factor);double length(void);12.3.1 单一继承的编译方案单一继承的编译方案12.3 继承的编译方案继承的编译方案void zoom(GraphicalObj&obj,double zoom_factor,Point¢er)obj.translate(center.x,center.y);/将将“中心中心”移至移至“点点(0,0)”obj.scale(zoom_factor);/缩放缩放如果函数如果函数zoom作用于矩形,那么作用于矩形,那么zoom的体必须的体必须调用

    21、调用Rectangle的缩放函数,而不是的缩放函数,而不是PolyLine甚至甚至GraphicalObj的缩放函数的缩放函数 12.3 继承的编译方案继承的编译方案编译器怎样有效地实现动态绑定?编译器怎样有效地实现动态绑定?编译器为每个类建立一个方法表,它们包含该编译器为每个类建立一个方法表,它们包含该类或它的超类中所有定义为类或它的超类中所有定义为virtual的方法的入的方法的入口口 每个对象在每个对象在C程序中有对应的结构体,再为这程序中有对应的结构体,再为这种结构体增加一个域,该域是方法表的指针种结构体增加一个域,该域是方法表的指针 继承类方法表的产生继承类方法表的产生首先拷贝基类的

    22、方法表,被重新定义的方法由新首先拷贝基类的方法表,被重新定义的方法由新的定义覆盖的定义覆盖然后把新引入的方法追加到这张表上然后把新引入的方法追加到这张表上12.3 继承的编译方案继承的编译方案图形对象的不同子类的方法表图形对象的不同子类的方法表GraphicalObjPolyLineRectangle length_RA scale_RA translate_PL length_PL scale_PL translate_PL scale_GO translate_GO12.3 继承的编译方案继承的编译方案Rectangle的对象表示的对象表示 length_RA scale_RA trans

    23、late_PL side2_length side1_length points 视图:视图:GraphicalObj PolyLine RectangleRectangle 方法表方法表12.3 继承的编译方案继承的编译方案12.3.2 重复继承的编译方案重复继承的编译方案重复继承对语言定义和编译器设计来说,都重复继承对语言定义和编译器设计来说,都具有很大的挑战性具有很大的挑战性 B1和和B2之之间的冲突与矛盾间的冲突与矛盾 重复继承重复继承 可以有多个实例可以有多个实例 只能有一个实例只能有一个实例AB1B2C12.3 继承的编译方案继承的编译方案B1和和B2之之间的冲突与矛盾间的冲突与矛

    24、盾这是这是语言定义问题语言定义问题,解决办法:,解决办法:将将B1定义为主要后代,冲突解决优先于定义为主要后代,冲突解决优先于B1 语言允许重新命名被继承的特征语言允许重新命名被继承的特征 语言提供显式地手段来解决冲突语言提供显式地手段来解决冲突 B1:n或或B2:n 实现起来并无什么困难,实现起来并无什么困难,只涉及到编译器符号表的只涉及到编译器符号表的组织和管理问题组织和管理问题AB1B2C12.3 继承的编译方案继承的编译方案重复继承的多个实例重复继承的多个实例附加(附加(B1)AA附加(附加(B2)附加(附加(C)附加(附加(B1)A附加(附加(B2)附加(附加(C)重复继承的单个实例

    25、重复继承的单个实例下面两种方式都有应用,仅讨论前者下面两种方式都有应用,仅讨论前者12.3 继承的编译方案继承的编译方案独立的重复继承的编译方案独立的重复继承的编译方案 继承类继承类C的对象包含基类的对象包含基类B1和和B2的完整拷贝的完整拷贝 来自基类的继承是相互独来自基类的继承是相互独立的立的B1B2附加(附加(C)独立的重复继承时的独立的重复继承时的对象结构(程序视图)对象结构(程序视图)12.3 继承的编译方案继承的编译方案重复继承在下述情况导致冲突和二义重复继承在下述情况导致冲突和二义 当多实例的特征被用于访问、当多实例的特征被用于访问、调用和覆盖的时候调用和覆盖的时候 当类当类C的

    26、对象的的对象的A视图被建立视图被建立时,因为类时,因为类C的对象包含多个的对象包含多个类类A子对象子对象 可见性规则可以在某些情可见性规则可以在某些情况下帮助避免这些困难况下帮助避免这些困难 B1B2附加(附加(C)独立的重复继承时的独立的重复继承时的对象结构(程序视图)对象结构(程序视图)12.3 继承的编译方案继承的编译方案独立的重复继承的对象结构(实现视图)独立的重复继承的对象结构(实现视图)(把单一继承的编译方案加以扩充把单一继承的编译方案加以扩充)B1B2附加附加(C)C方法方法B2方法方法B1方法方法B2方法方法C方法表方法表C:B2方法表方法表C引用,引用,B1引用引用B2引用引

    27、用12.3 继承的编译方案继承的编译方案C对象的对象的B1视图是视图是C视图的开头部分视图的开头部分C视图的开头部分不能作为视图的开头部分不能作为B2视图视图B1B2附加附加(C)C方法方法B2方法方法B1方法方法B2方法方法C方法表方法表C:B2方法表方法表C引用,引用,B1引用引用B2引用引用12.3 继承的编译方案继承的编译方案困难的事情是,从困难的事情是,从B2的视图来恢复的视图来恢复C的视图,的视图,因为不知因为不知B2引用和引用和C引用的距离引用的距离B1B2附加附加(C)C方法方法B2方法方法B1方法方法B2方法方法C方法表方法表C:B2方法表方法表C引用,引用,B1引用引用B2引用引用12.3 继承的编译方案继承的编译方案编译器把用于确定所需视图的偏移存放在方编译器把用于确定所需视图的偏移存放在方法表中下邻该方法指针的地方法表中下邻该方法指针的地方B1B2附加附加(C)C方法方法B2方法方法B1方法方法B2方法方法C方法表方法表C:B2方法表方法表C引用,引用,B1引用引用B2引用引用12.3 继承的编译方案继承的编译方案独立的重复继承的对象结构(实际视图)独立的重复继承的对象结构(实际视图)B1B2附加附加(C)C方法方法B1方法方法B2方法方法C方法表方法表C引用,引用,B1引用引用B2引用引用习习 题题

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:面向对象语言的编译课件.ppt
    链接地址:https://www.163wenku.com/p-4941491.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库