第十二章面向對象語言的編譯_第1頁
第十二章面向對象語言的編譯_第2頁
第十二章面向對象語言的編譯_第3頁
第十二章面向對象語言的編譯_第4頁
已閱讀5頁,還剩33頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

6、.1 面向對象語言的概念面向對象語言的概念 動態綁定規則動態綁定規則當對象當對象o的一個方法可能被子類重新定義時,的一個方法可能被子類重新定義時,如果編譯器不能確定如果編譯器不能確定o的運行時類型,那么必的運行時類型,那么必須對該方法進行動態綁定須對該方法進行動態綁定void zoom (GraphicalObj &obj, double zoom_factor, Point &center) obj.translate ( center.x, center.y); / 將將“中心中心”移至移至“點點(0, 0)”obj.scale (zoom_factor); / 縮放縮放1

7、2.1 面向對象語言的概念面向對象語言的概念12.1.3 信息封裝信息封裝 大多數面向對象語言提供了一種機制,它可大多數面向對象語言提供了一種機制,它可用來將類的特征分成私有的和公共的用來將類的特征分成私有的和公共的 某些面向對象語言用不同的上下文區分作用某些面向對象語言用不同的上下文區分作用域,如域,如“在一個類中在一個類中”、“在派生類中在派生類中”、“在友元類中在友元類中”等等等等 由編譯器來實現這些作用域規則是簡單而又由編譯器來實現這些作用域規則是簡單而又明顯明顯的的 12.2 方法的編譯方法的編譯 先定義一般的圖形對象類先定義一般的圖形對象類GraphicalObj如下如下:clas

8、s GraphicalObj virtual void 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 s

9、cale (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;double y(void) return yc;double dist (Point &);12.2 方法的編譯方法的編譯 將一個將一個C+語言的類翻譯成語言的類翻譯成C語言的程序段,主語言的程序段,主要工作有如下幾點要工作有如下幾

10、點( (由繼承引出的問題暫不考慮由繼承引出的問題暫不考慮) ) 將將C+語言中一個類的所有非靜態屬性構成一語言中一個類的所有非靜態屬性構成一個個C語言的結構體類型,取類的名字作為結構語言的結構體類型,取類的名字作為結構體類型的名字體類型的名字 類的靜態屬性是該類的所有對象所共有的類的靜態屬性是該類的所有對象所共有的, ,應應當翻譯成當翻譯成C中的全局變量,但是需要改一個名中的全局變量,但是需要改一個名字字 C+語言中類的對象聲明不加翻譯就成了語言中類的對象聲明不加翻譯就成了C語語言中相應結構體類型的變量聲明言中相應結構體類型的變量聲明12.2 方法的編譯方法的編譯 將將C+語言中類的非靜態方法

11、翻譯成語言中類的非靜態方法翻譯成C語言的語言的函數,對應的方法和函數的區別有下面幾點:函數,對應的方法和函數的區別有下面幾點: 函數的名字必須在原來方法名的基礎上修改函數的名字必須在原來方法名的基礎上修改 函數聲明增加一個形參函數聲明增加一個形參this 在函數體中出現的函數調用也要增加一個實參在函數體中出現的函數調用也要增加一個實參 在方法中對本對象的非靜態屬性的訪問,改成對在方法中對本對象的非靜態屬性的訪問,改成對this相應域的訪問。在方法中對其它對象的非靜態相應域的訪問。在方法中對其它對象的非靜態屬性的訪問不必修改屬性的訪問不必修改 類的靜態方法在定義和調用的地方都需要改名類的靜態方法

12、在定義和調用的地方都需要改名12.2 方法的編譯方法的編譯 方方 法法 函函 數數 原型原型 返回類型返回類型 m(形參表形參表) ) 返回類型返回類型 fm( (C &this, , 形參表形參表) )調用調用 m(實參表)實參表)o.n(實參表)實參表)fm(this,實參表)實參表) fn(o,實參表)實參表) 屬性訪問屬性訪問 ko.kthis.ko.k類類C的方法的方法m被翻譯成函數被翻譯成函數fm 12.2 方法的編譯方法的編譯 類類Point的方法的方法translate翻譯成函數翻譯成函數translate_ _5Pointddvoid translate_ _5Poi

13、ntdd(Point this, double x_offset , double y_offset) this.xc += x_offset; this.yc += y _offset;12.3 繼承的編譯方案繼承的編譯方案圖形對象的繼承層次結構圖形對象的繼承層次結構GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle BA12.3 繼承的編譯方案繼承的編譯方案圖

14、形對象的繼承層次結構圖形對象的繼承層次結構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 Po

15、lyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 若類若類B直接或間接繼承直接或間接繼承類類A,類類B的對象可用在的對象可用在類類A的對象可用的地方的對象可用的地方矩形矩形: 可作為可作為多邊形使用多邊形使用12.3 繼承的編譯方案繼承的編譯方案圖形對象的繼承層次結構圖形對象的繼承層次結構GraphicalObj translate scale PolyLine translate scale lengthC

16、losedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 編譯器必須能以一種有編譯器必須能以一種有效的方式產生類效的方式產生類B對象的對象的A視圖視圖矩形矩形: 可作為可作為多邊形使用多邊形使用12.3 繼承的編譯方案繼承的編譯方案圖形對象的繼承層次結構圖形對象的繼承層次結構GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scal

17、e areaPolyGon areaRectanglearea Triangle B矩形矩形A 因類因類A的虛方法可在類的虛方法可在類B中被重寫,又需中被重寫,又需B視圖視圖能夠有效地從能夠有效地從A視圖恢復視圖恢復矩形矩形: 可作為可作為多邊形使用多邊形使用12.3 繼承的編譯方案繼承的編譯方案圖形對象的繼承層次結構圖形對象的繼承層次結構GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectangle

18、area Triangle B矩形矩形A 因類因類A的虛方法可在類的虛方法可在類B中被重寫,又需中被重寫,又需B視圖視圖能夠有效地從能夠有效地從A視圖恢復視圖恢復矩形矩形: 要能恢要能恢復矩形信息復矩形信息12.3 繼承的編譯方案繼承的編譯方案圖形對象的繼承層次結構圖形對象的繼承層次結構GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 需要編譯器為

19、類的對象需要編譯器為類的對象設計具有某種靈活的結構設計具有某種靈活的結構矩形矩形: 要能恢要能恢復矩形信息復矩形信息12.3 繼承的編譯方案繼承的編譯方案#include “graphicalobj.h”#include “list.h” #include “point.h”class PolyLine : public GraphicalObj list points; public:void translate (double x_offset, double y_offset);virtual void scale (double factor);virtual double lengt

20、h (void);#include “polyline.h”class 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,

21、 double zoom_factor, Point &center) obj.translate ( center.x, center.y); / 將將“中心中心”移至移至“點點(0, 0)”obj.scale (zoom_factor); / 縮放縮放如果函數如果函數zoom作用于矩形,那么作用于矩形,那么zoom的體必須的體必須調用調用Rectangle的縮放函數,而不是的縮放函數,而不是PolyLine甚至甚至GraphicalObj的縮放函數的縮放函數 12.3 繼承的編譯方案繼承的編譯方案編譯器怎樣有效地實現動態綁定?編譯器怎樣有效地實現動態綁定? 編譯器為每個類建立一個方

22、法表,它們包含該編譯器為每個類建立一個方法表,它們包含該類或它的超類中所有定義為類或它的超類中所有定義為virtual的方法的入的方法的入口口 每個對象在每個對象在C程序中有對應的結構體,再為這程序中有對應的結構體,再為這種結構體增加一個域,該域是方法表的指針種結構體增加一個域,該域是方法表的指針 繼承類方法表的產生繼承類方法表的產生首先拷貝基類的方法表,被重新定義的方法由新首先拷貝基類的方法表,被重新定義的方法由新的定義覆蓋的定義覆蓋然后把新引入的方法追加到這張表上然后把新引入的方法追加到這張表上12.3 繼承的編譯方案繼承的編譯方案圖形對象的不同子類的方法表圖形對象的不同子類的方法表Gra

23、phicalObjPolyLineRectangle 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 重復繼承

24、的編譯方案重復繼承的編譯方案重復繼承對語言定義和編譯器設計來說,都重復繼承對語言定義和編譯器設計來說,都具有很大的挑戰性具有很大的挑戰性 B1和和B2之之間的沖突與矛盾間的沖突與矛盾 重復繼承重復繼承 可以有多個實例可以有多個實例 只能有一個實例只能有一個實例AB1B2C12.3 繼承的編譯方案繼承的編譯方案B1和和B2之之間的沖突與矛盾間的沖突與矛盾這是這是語言定義問題語言定義問題,解決辦法:,解決辦法: 將將B1定義為主要后代,沖突解決優先于定義為主要后代,沖突解決優先于B1 語言允許重新命名被繼承的特征語言允許重新命名被繼承的特征 語言提供顯式地手段來解決沖突語言提供顯式地手段來解決沖突

25、 B1:n或或B2:n 實現起來并無什么困難,實現起來并無什么困難,只涉及到編譯器符號表的只涉及到編譯器符號表的組織和管理問題組織和管理問題AB1B2C12.3 繼承的編譯方案繼承的編譯方案重復繼承的多個實例重復繼承的多個實例附加(附加(B1)AA附加(附加(B2)附加(附加(C)附加(附加(B1)A附加(附加(B2)附加(附加(C)重復繼承的單個實例重復繼承的單個實例下面兩種方式都有應用,僅討論前者下面兩種方式都有應用,僅討論前者12.3 繼承的編譯方案繼承的編譯方案獨立的重復繼承的編譯方案獨立的重復繼承的編譯方案 繼承類繼承類C的對象包含基類的對象包含基類B1和和B2的完整拷貝的完整拷貝 來自基類的繼承是相互獨來自基類的繼承是相互獨立的立的B1B2附加(附加(C)獨立的重復繼承時的獨立的重復繼承時的對象結構(程序視圖)對象結構(程序視圖)12.3 繼承的編譯方案繼承的編譯方案重復繼承在下述情況導致沖突和二義重復繼承在下述情況導致沖突和二義 當多實例的特征被用于訪問、當多實例的特征被用于訪問、調用和覆蓋的時候調用和覆蓋的時候 當類當類C的對象的的對象的A視圖被建立視圖被建立

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論