第十二章 面向对象语言的编译 本章内容 概述面向对象语言的重要概念和实现技术 以C++语言为例,介绍如何将C++程序翻译 成C程序 实际的编译器大都把C++程序直接翻译成低 级语言程序
第十二章 面向对象语言的编译 本章内容 • 概述面向对象语言的重要概念和实现技术 • 以C++语言为例,介绍如何将C++程序翻译 成C程序 • 实际的编译器大都把C++程序直接翻译成低 级语言程序
12.1面向对象语言的概念 12.1.1对象和对象类 对象 由一组属性和操作于这组属性的过程组成 属性到值的映射称为对象的状态,过程称为方法 对象类 类对象的总称,规范了该类中对象的属性和方 法,包括它们的类型和原型 对象有自己存放属性的存储单元;同一个类的对 象可以共享方法的代码 对象类形成了面向对象语言的模块单元 下面将把术语“类”和“类型”看成是同义的
12.1 面向对象语言的概念 12.1.1 对象和对象类 • 对象 – 由一组属性和操作于这组属性的过程组成 – 属性到值的映射称为对象的状态,过程称为方法 • 对象类 – 一类对象的总称,规范了该类中对象的属性和方 法,包括它们的类型和原型 – 对象有自己存放属性的存储单元;同一个类的对 象可以共享方法的代码 – 对象类形成了面向对象语言的模块单元 – 下面将把术语“类”和“类型”看成是同义的
12.1 面向对象语言的概念 12.1.2继承 图形对象的继承层次结构 GraphicalObj translate scale PolyLine translate scale ClosedGraphics length area Ellipse PolyGon translate area scale area Rectangle Triangle area
12.1 面向对象语言的概念 12.1.2 继承 图形对象的继承层次结构 GraphicalObj translate scale PolyLine translate scale length ClosedGraphics area Ellipse translate scale area PolyGon area Rectangle area Triangle … … … … … …
12.1面向对象语言的概念 继承 基类、派生类、子类、抽象类 子类型规则 当某个类型的一个对象在某个输入位置被需要或作 为函数的返回值时,其任何子类型的对象允许出现 在这些地方 类B的一个对象,若它不同时是B的某个真子 类的对象,那么称该对象是B的真对象,称B 是该对象的运行时类型
12.1 面向对象语言的概念 继承 • 基类、派生类、子类、抽象类 • 子类型规则 当某个类型的一个对象在某个输入位置被需要或作 为函数的返回值时,其任何子类型的对象允许出现 在这些地方 • 类B的一个对象,若它不同时是B的某个真子 类的对象,那么称该对象是B的真对象,称B 是该对象的运行时类型
12.1面向对象语言的概念 12.1.2继承 图形对象的继承层次结构 GraphicalObj translate scale PolyLine translate scale ClosedGraphics length area Ellipse PolyGon translate area scale area Rectangle Triangle area
12.1 面向对象语言的概念 12.1.2 继承 图形对象的继承层次结构 GraphicalObj translate scale PolyLine translate scale length ClosedGraphics area Ellipse translate scale area PolyGon area Rectangle area Triangle … … … … … … B
12.1面向对象语言的概念 方法选择规则 如果类B继承类A并且重写了方法m,那么对 类B的对象b来说,即使它作为类A的对象使用 也必须使用在类B中定义的方法m
12.1 面向对象语言的概念 • 方法选择规则 如果类B继承类A并且重写了方法m,那么对 类B的对象b来说, 即使它作为类A的对象使用, 也必须使用在类B中定义的方法m
12.1面向对象语言的概念 12.1.2继承 图形对象的继承层次结构 GraphicalObj translate scale PolyLine translate scale ClosedGraphics length area Ellipse PolyGon translate area scale area Rectangle Triangle area
12.1 面向对象语言的概念 12.1.2 继承 图形对象的继承层次结构 GraphicalObj translate scale PolyLine translate scale length ClosedGraphics area Ellipse translate scale area PolyGon area Rectangle area Triangle … … … … … … B A
12.1面向对象语言的概念 动态绑定规则 当对象的一个方法可能被子类重新定义时, 如果编译器不能确定o的运行时类型,那么必 须对该方法进行动态绑定 void zoom (GraphicalObj &obj,double zoom factor,Point ¢er) obj.translate (-center.x,-center.y); /将“中心”移至“点(0,0) obj.scale(zoom factor);∥缩放
12.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面向对象语言的概念 12.1.3信息封装 大多数面向对象语言提供了一种机制,它可 用来将类的特征分成私有的和公共的 某些面向对象语言用不同的上下文区分作用 域,如“在一个类中”、 在派生类中”、 在友元类中”等等 由编译器来实现这些作用域规则是简单而又 明显的
12.1 面向对象语言的概念 12.1.3 信息封装 • 大多数面向对象语言提供了一种机制,它可 用来将类的特征分成私有的和公共的 • 某些面向对象语言用不同的上下文区分作用 域,如“在一个类中” 、 “在派生类中” 、 “在友元类中”等等 • 由编译器来实现这些作用域规则是简单而又 明显的
12.2 方法的编译 先定义一般的图形对象类GraphicalObj如下: class GraphicalObj virtual void translate (double x offset,double y_offset); virtual void scale (double factor); /可能还有一些其它方法
12.2 方法的编译 先定义一般的图形对象类GraphicalObj如下: class GraphicalObj { virtual void translate (double x_offset, double y_offset); virtual void scale (double factor); . . . // 可能还有一些其它方法 };