第十二章面向?qū)ο笳Z言的編譯_第1頁
第十二章面向?qū)ο笳Z言的編譯_第2頁
第十二章面向?qū)ο笳Z言的編譯_第3頁
第十二章面向?qū)ο笳Z言的編譯_第4頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第十二章第十二章 面向?qū)ο笳Z言的編譯面向?qū)ο笳Z言的編譯本章內(nèi)容本章內(nèi)容 概述面向?qū)ο笳Z言的重要概念和實現(xiàn)技術(shù)概述面向?qū)ο笳Z言的重要概念和實現(xiàn)技術(shù) 以以C+語言為例,介紹如何將語言為例,介紹如何將C+程序翻譯程序翻譯成成C程序程序 實際的編譯器大都把實際的編譯器大都把C+程序直接翻譯成低程序直接翻譯成低級語言程序級語言程序12.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念12.1.1 對象和對象類對象和對象類 對象對象 由一組屬性和操作于這組屬性的過程組成由一組屬性和操作于這組屬性的過程組成 屬性到值的映射稱為對象的狀態(tài),過程稱為方法屬性到值的映射稱為對象的狀態(tài),過程稱為方法 對象類對象類 一類對象

2、的總稱,規(guī)范了該類中對象的屬性和方一類對象的總稱,規(guī)范了該類中對象的屬性和方法,包括它們的類型和原型法,包括它們的類型和原型 對象有自己存放屬性的存儲單元;同一個類的對對象有自己存放屬性的存儲單元;同一個類的對象可以共享方法的代碼象可以共享方法的代碼 對象類形成了面向?qū)ο笳Z言的模塊單元對象類形成了面向?qū)ο笳Z言的模塊單元 下面將把術(shù)語下面將把術(shù)語“類類”和和“類型類型”看成是同義的看成是同義的12.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念12.1.2 繼承繼承圖形對象的繼承層次結(jié)構(gòu)圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate

3、 scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle 12.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念繼承繼承 基類、派生類、子類、抽象類基類、派生類、子類、抽象類 子類型規(guī)則子類型規(guī)則當(dāng)某個類型的一個對象在某個輸入位置被需要或作當(dāng)某個類型的一個對象在某個輸入位置被需要或作為函數(shù)的返回值時,其任何子類型的對象允許出現(xiàn)為函數(shù)的返回值時,其任何子類型的對象允許出現(xiàn)在這些地方在這些地方 類類B的一個對象,若它不同時是的一個對象,若它不同時是B的某個真子的某個真子類的

4、對象,那么稱該對象是類的對象,那么稱該對象是B的的真對象真對象,稱,稱B是該對象的是該對象的運(yùn)行時類型運(yùn)行時類型12.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念12.1.2 繼承繼承圖形對象的繼承層次結(jié)構(gòu)圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B12.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念 方法選擇規(guī)則方法選擇規(guī)則如果類如果類B繼

5、承類繼承類A并且重寫了方法并且重寫了方法m,那么對那么對類類B的對象的對象b來說來說, 即使它作為類即使它作為類A的對象使用的對象使用, 也必須使用在類也必須使用在類B中定義的方法中定義的方法m12.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念12.1.2 繼承繼承圖形對象的繼承層次結(jié)構(gòu)圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle BA12

6、.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念 動態(tài)綁定規(guī)則動態(tài)綁定規(guī)則當(dāng)對象當(dāng)對象o的一個方法可能被子類重新定義時,的一個方法可能被子類重新定義時,如果編譯器不能確定如果編譯器不能確定o的運(yùn)行時類型,那么必的運(yùn)行時類型,那么必須對該方法進(jìn)行動態(tài)綁定須對該方法進(jìn)行動態(tài)綁定void zoom (GraphicalObj &obj, double zoom_factor, Point &center) obj.translate ( center.x, center.y); / 將將“中心中心”移至移至“點(diǎn)點(diǎn)(0, 0)”obj.scale (zoom_factor); / 縮放縮放1

7、2.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念12.1.3 信息封裝信息封裝 大多數(shù)面向?qū)ο笳Z言提供了一種機(jī)制,它可大多數(shù)面向?qū)ο笳Z言提供了一種機(jī)制,它可用來將類的特征分成私有的和公共的用來將類的特征分成私有的和公共的 某些面向?qū)ο笳Z言用不同的上下文區(qū)分作用某些面向?qū)ο笳Z言用不同的上下文區(qū)分作用域,如域,如“在一個類中在一個類中”、“在派生類中在派生類中”、“在友元類中在友元類中”等等等等 由編譯器來實現(xiàn)這些作用域規(guī)則是簡單而又由編譯器來實現(xiàn)這些作用域規(guī)則是簡單而又明顯明顯的的 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語言的程序段,主語言的程序段,主要工作有如下幾點(diǎn)要工作有如下幾

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

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

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

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

14、形對象的繼承層次結(jié)構(gòu)圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形矩形A 若類若類B直接或間接繼承直接或間接繼承類類A,類類B的對象可用在的對象可用在類類A的對象可用的地方的對象可用的地方12.3 繼承的編譯方案繼承的編譯方案圖形對象的繼承層次結(jié)構(gòu)圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale Po

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

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

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

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

19、類的對象需要編譯器為類的對象設(shè)計具有某種靈活的結(jié)構(gòu)設(shè)計具有某種靈活的結(jié)構(gòu)矩形矩形: 要能恢要能恢復(fù)矩形信息復(fù)矩形信息12.3 繼承的編譯方案繼承的編譯方案#include “graphicalobj.h”#include “l(fā)ist.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); / 將將“中心中心”移至移至“點(diǎn)點(diǎn)(0, 0)”obj.scale (zoom_factor); / 縮放縮放如果函數(shù)如果函數(shù)zoom作用于矩形,那么作用于矩形,那么zoom的體必須的體必須調(diào)用調(diào)用Rectangle的縮放函數(shù),而不是的縮放函數(shù),而不是PolyLine甚至甚至GraphicalObj的縮放函數(shù)的縮放函數(shù) 12.3 繼承的編譯方案繼承的編譯方案編譯器怎樣有效地實現(xiàn)動態(tài)綁定?編譯器怎樣有效地實現(xiàn)動態(tài)綁定? 編譯器為每個類建立一個方

22、法表,它們包含該編譯器為每個類建立一個方法表,它們包含該類或它的超類中所有定義為類或它的超類中所有定義為virtual的方法的入的方法的入口口 每個對象在每個對象在C程序中有對應(yīng)的結(jié)構(gòu)體,再為這程序中有對應(yīng)的結(jié)構(gòu)體,再為這種結(jié)構(gòu)體增加一個域,該域是方法表的指針種結(jié)構(gòu)體增加一個域,該域是方法表的指針 繼承類方法表的產(chǎn)生繼承類方法表的產(chǎn)生首先拷貝基類的方法表,被重新定義的方法由新首先拷貝基類的方法表,被重新定義的方法由新的定義覆蓋的定義覆蓋然后把新引入的方法追加到這張表上然后把新引入的方法追加到這張表上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 重復(fù)繼承

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

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

溫馨提示

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

評論

0/150

提交評論