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

下載本文檔

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

文檔簡介

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

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

3、gthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle 11.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)行時類型11.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念11.1.2 繼承繼承圖形對象的繼承層次結(jié)構(gòu)圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B11.1 面向?qū)ο笳Z言的概念面向?qū)ο笳Z言的概念 方法選擇規(guī)則方法選擇規(guī)則如果類如果類B繼承類繼承類A并且

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

6、言的概念面向?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 ¢er) obj.translate ( center.x, center.y); / 將中心點(diǎn)移至原點(diǎn)將中心點(diǎn)移至原點(diǎn)(0, 0)obj.scale (zoom_factor); / 縮放縮放11.1 面向?qū)ο笳Z言的概念面向?qū)?/p>

7、象語言的概念11.1.3 信息封裝信息封裝 大多數(shù)面向?qū)ο笳Z言提供了一種機(jī)制,它可大多數(shù)面向?qū)ο笳Z言提供了一種機(jī)制,它可用來將類的特征分成私有的和公共的用來將類的特征分成私有的和公共的 某些面向?qū)ο笳Z言用不同的上下文區(qū)分作用某些面向?qū)ο笳Z言用不同的上下文區(qū)分作用域,如域,如“在一個類中在一個類中”、“在派生類中在派生類中”、“在友元類中在友元類中”等等等等 由編譯器來實(shí)現(xiàn)這些作用域規(guī)則是簡單而又由編譯器來實(shí)現(xiàn)這些作用域規(guī)則是簡單而又明顯明顯的的 11.2 方法的編譯方法的編譯 先定義一般的圖形對象類先定義一般的圖形對象類GraphicalObj如下如下:class GraphicalObj v

8、irtual void translate (double x_offset, double y_offset);virtual void scale (double factor);. . . / 可能還有一些其它方法可能還有一些其它方法; 11.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 fac

9、tor) 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 &);11.2 方法的編譯方法的編譯 將一個將一個C+語言的類翻譯成語言的類翻譯成C語言的程序段,主語言的程序段,主要工作有如下幾點(diǎn)要工作有如下幾點(diǎn)( (由繼承引出的問題暫不考慮由繼承引

10、出的問題暫不考慮) ) 將將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)當(dāng)應(yīng)當(dāng)翻譯成翻譯成C中的全局變量,但是需要改一個名字中的全局變量,但是需要改一個名字 C+語言中類的對象聲明不加翻譯就成了語言中類的對象聲明不加翻譯就成了C語語言中相應(yīng)結(jié)構(gòu)類型的變量聲明言中相應(yīng)結(jié)構(gòu)類型的變量聲明11.2 方法的編譯方法的編譯 將將C+語言中類的非靜態(tài)方法翻譯成語言中類的非靜態(tài)方法翻譯成C語言的函語言的函數(shù)

11、,對應(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í)參在函數(shù)體中出現(xiàn)的函數(shù)調(diào)用也要增加一個實(shí)參在方法中對本對象的非靜態(tài)屬性的訪問,改成對在方法中對本對象的非靜態(tài)屬性的訪問,改成對this相應(yīng)域的訪問。在方法中對其它對象的非靜態(tài)相應(yīng)域的訪問。在方法中對其它對象的非靜態(tài)屬性的訪問不必修改屬性的訪問不必修改 類的靜態(tài)方法在定義和調(diào)用的地方都需要改名類的靜態(tài)方法在定義和調(diào)用的地方都需要改名11.2 方法的編譯方法的編譯

12、方方 法法 函函 數(shù)數(shù) 原型原型 返回類型返回類型 m(形參表形參表) ) 返回類型返回類型 fm( (C &this, , 形參表形參表) )調(diào)用調(diào)用 m(實(shí)參表)實(shí)參表)o.n(實(shí)參表)實(shí)參表)fm(this,實(shí)參表)實(shí)參表) fn(o,實(shí)參表)實(shí)參表) 屬性訪問屬性訪問 ko.kthis.ko.k類類C的方法的方法m被翻譯成函數(shù)被翻譯成函數(shù)fm 11.2 方法的編譯方法的編譯 類類Point的方法的方法translate翻譯成函數(shù)翻譯成函數(shù)translate_ _5Pointddvoid translate_ _5Pointdd(Point this, double x_offset ,

13、 double y_offset) this.xc += x_offset; this.yc += y _offset;11.3 繼承的編譯方案繼承的編譯方案 如果類如果類B直接或間接繼承類直接或間接繼承類A,類類B的對象可以的對象可以用在幾乎所有類用在幾乎所有類A的對象可用的地方。的對象可用的地方。 為了使類為了使類B的對象可以作為類的對象可以作為類A的對象使用,編的對象使用,編譯器必須能以一種有效的方式產(chǎn)生類譯器必須能以一種有效的方式產(chǎn)生類B的對象的對象的的A視圖。視圖。 由于類由于類A的虛方法可以在類的虛方法可以在類B中被重寫,我們又中被重寫,我們又需要需要B視圖能夠有效地從視圖能夠有效

14、地從A視圖產(chǎn)生視圖產(chǎn)生。 這樣,編譯器要求類的對象具有某種靈活的結(jié)這樣,編譯器要求類的對象具有某種靈活的結(jié)構(gòu)。構(gòu)。 11.3 繼承的編譯方案繼承的編譯方案圖形對象的繼承層次結(jié)構(gòu)圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle 11.3 繼承的編譯方案繼承的編譯方案#include “graphicalobj.h”#include “l(fā)ist

15、.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 length (void);#include “polyline.h”class Rectangle : public PolyLine double side1_length, double side2_length; public :Re

16、ctangle (double s1_len, double s2_len, double x_angle = 0);void scale (double factor);double length (void);11.3.1 單一繼承的編譯方案單一繼承的編譯方案11.3 繼承的編譯方案繼承的編譯方案void zoom (GraphicalObj &obj, double zoom_factor, Point ¢er) obj.translate ( center.x, center.y); / 將中心點(diǎn)移至原點(diǎn)將中心點(diǎn)移至原點(diǎn)(0, 0)obj.scale (zoom_factor)

17、; / 縮放縮放如果函數(shù)如果函數(shù)zoom作用于矩形,那么作用于矩形,那么zoom的體必須的體必須調(diào)用調(diào)用Rectangle的縮放函數(shù),而不是的縮放函數(shù),而不是PolyLine甚至甚至GraphicalObj的縮放函數(shù)的縮放函數(shù) 11.3 繼承的編譯方案繼承的編譯方案 必須解釋編譯器是怎樣有效地實(shí)現(xiàn)動態(tài)綁定的必須解釋編譯器是怎樣有效地實(shí)現(xiàn)動態(tài)綁定的 編譯器為每個類建立一個方法表,它們包含一編譯器為每個類建立一個方法表,它們包含一個類或它的超類中所有定義為個類或它的超類中所有定義為virtual的方法的的方法的入口入口 每個對象在每個對象在C程序中有對應(yīng)的結(jié)構(gòu),現(xiàn)在為這程序中有對應(yīng)的結(jié)構(gòu),現(xiàn)在為這

18、樣的結(jié)構(gòu)增加一個域,該域是方法表的指針樣的結(jié)構(gòu)增加一個域,該域是方法表的指針 繼承類方法表的產(chǎn)生:首先拷貝基類的方法表繼承類方法表的產(chǎn)生:首先拷貝基類的方法表, ,被重新定義的方法由新的定義覆蓋;然后,新被重新定義的方法由新的定義覆蓋;然后,新引入的方法被追加到這張表上引入的方法被追加到這張表上11.3 繼承的編譯方案繼承的編譯方案圖形對象的不同子類的方法表圖形對象的不同子類的方法表GraphicalObjPolyLineRectangle length_RA scale_RA translate_PL length_PL scale_PL translate_PL scale_GO tran

19、slate_GO11.3 繼承的編譯方案繼承的編譯方案Rectangle的對象表示的對象表示 length_RA scale_RA translate_PL side2_length side1_length points 視圖:視圖: GraphicalObj PolyLine RectangleRectangle 方法表方法表11.3 繼承的編譯方案繼承的編譯方案11.3.2 重復(fù)繼承的編譯方案重復(fù)繼承的編譯方案重復(fù)繼承對語言定義和編譯器設(shè)計(jì)來說,都具重復(fù)繼承對語言定義和編譯器設(shè)計(jì)來說,都具有很大的挑戰(zhàn)性有很大的挑戰(zhàn)性 B1和和B2間的沖突與矛盾間的沖突與矛盾 重復(fù)繼承重復(fù)繼承可以有多個實(shí)

20、例可以有多個實(shí)例只能有一個實(shí)例只能有一個實(shí)例AB1B2C11.3 繼承的編譯方案繼承的編譯方案B1和和B2間的沖突與矛盾間的沖突與矛盾這是這是語言定義問題語言定義問題,解決辦法:,解決辦法: 將將B1定義為主要后代,沖突解決優(yōu)先于定義為主要后代,沖突解決優(yōu)先于B1 語言允許重新命名被繼承的特征語言允許重新命名被繼承的特征 語言提供顯式地手段來解決沖突語言提供顯式地手段來解決沖突 B1:n或或B2:n 實(shí)現(xiàn)起來并無什么困難,實(shí)現(xiàn)起來并無什么困難,只涉及到編譯器符號表的只涉及到編譯器符號表的組織和管理問題組織和管理問題AB1B2C11.3 繼承的編譯方案繼承的編譯方案重復(fù)繼承的多個實(shí)例重復(fù)繼承的多

21、個實(shí)例附加(附加(B1)AA附加(附加(B2)附加(附加(C)附加(附加(B1)A附加(附加(B2)附加(附加(C)重復(fù)繼承的單個實(shí)例重復(fù)繼承的單個實(shí)例下面兩種方式都有應(yīng)用,我們僅討論前者下面兩種方式都有應(yīng)用,我們僅討論前者11.3 繼承的編譯方案繼承的編譯方案獨(dú)立的重復(fù)繼承的編譯方案獨(dú)立的重復(fù)繼承的編譯方案 繼承類繼承類C的對象包含基類的對象包含基類B1和和B2的完整拷貝的完整拷貝 來自基類的繼承是相互獨(dú)來自基類的繼承是相互獨(dú)立的立的B1B2附加(附加(C)獨(dú)立的重復(fù)繼承時的獨(dú)立的重復(fù)繼承時的對象結(jié)構(gòu)(程序視圖)對象結(jié)構(gòu)(程序視圖)11.3 繼承的編譯方案繼承的編譯方案重復(fù)繼承在下述情況導(dǎo)致沖突和二義重復(fù)繼承在下述情況導(dǎo)致沖突和二義 當(dāng)多實(shí)例的特征被用于訪問、當(dāng)多實(shí)例的特征被用于訪問、調(diào)用和覆蓋的時候調(diào)用和覆蓋的時候 當(dāng)類當(dāng)類C的對象的的對象的A視圖被建立視圖被建立時。因?yàn)轭悤r。因?yàn)轭怌的對象包含多個的對象包含多個類類A子對象子對象 可見性規(guī)則可以在某些情可見性規(guī)則可以在某些情況下幫助避免這些困難況下幫助避免這些困難 B1B2附加(附加(C)獨(dú)立的重復(fù)繼承時的獨(dú)立的重復(fù)繼

溫馨提示

  • 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

提交評論