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

下載本文檔

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

文檔簡介

1、第十二章 面向?qū)ο笳Z言的編譯本章內(nèi)容概述面向?qū)ο笳Z言的重要概念和實現(xiàn)技術(shù)以C+語言為例,介紹如何將C+程序翻譯成C程序?qū)嶋H的編譯器大都把C+程序直接翻譯成低級語言程序第1頁,共38頁。12.1 面向?qū)ο笳Z言的概念12.1.1 對象和對象類對象由一組屬性和操作于這組屬性的過程組成屬性到值的映射稱為對象的狀態(tài),過程稱為方法對象類一類對象的總稱,規(guī)范了該類中對象的屬性和方法,包括它們的類型和原型對象有自己存放屬性的存儲單元;同一個類的對象可以共享方法的代碼對象類形成了面向?qū)ο笳Z言的模塊單元下面將把術(shù)語“類”和“類型”看成是同義的第2頁,共38頁。12.1 面向?qū)ο笳Z言的概念12.1.2 繼承圖形對象

2、的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle 第3頁,共38頁。12.1 面向?qū)ο笳Z言的概念繼承基類、派生類、子類、抽象類子類型規(guī)則當某個類型的一個對象在某個輸入位置被需要或作為函數(shù)的返回值時,其任何子類型的對象允許出現(xiàn)在這些地方類B的一個對象,若它不同時是B的某個真子類的對象,那么稱該對象是B的真對象,稱B是該對象的運行時類型第4頁,共38頁

3、。12.1 面向?qū)ο笳Z言的概念12.1.2 繼承圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B第5頁,共38頁。12.1 面向?qū)ο笳Z言的概念方法選擇規(guī)則如果類B繼承類A并且重寫了方法m,那么對類B的對象b來說, 即使它作為類A的對象使用, 也必須使用在類B中定義的方法m第6頁,共38頁。12.1 面向?qū)ο笳Z言的概念12.1.2 繼承圖

4、形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle BA第7頁,共38頁。12.1 面向?qū)ο笳Z言的概念動態(tài)綁定規(guī)則當對象o的一個方法可能被子類重新定義時,如果編譯器不能確定o的運行時類型,那么必須對該方法進行動態(tài)綁定void zoom (GraphicalObj &obj, double zoom_factor, Point ¢er)

5、obj.translate (center.x, center.y); / 將“中心”移至“點(0, 0)”obj.scale (zoom_factor); / 縮放第8頁,共38頁。12.1 面向?qū)ο笳Z言的概念12.1.3 信息封裝大多數(shù)面向?qū)ο笳Z言提供了一種機制,它可用來將類的特征分成私有的和公共的某些面向?qū)ο笳Z言用不同的上下文區(qū)分作用域,如“在一個類中”、“在派生類中”、“在友元類中”等等由編譯器來實現(xiàn)這些作用域規(guī)則是簡單而又明顯的 第9頁,共38頁。12.2 方法的編譯 先定義一般的圖形對象類GraphicalObj如下:class GraphicalObj virtual void

6、translate (double x_offset, double y_offset);virtual void scale (double factor);. . . / 可能還有一些其它方法; 第10頁,共38頁。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

7、; 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頁,共38頁。12.2 方法的編譯 將一個C+語言的類翻譯成C語言的程序段,主要工作有如下幾點(由繼承引出的問題暫不考慮)將C+語言中一個類的所有非靜態(tài)屬性構(gòu)成一個C語言的結(jié)構(gòu)體類型,取類的名字作為結(jié)構(gòu)體類型的名字類

8、的靜態(tài)屬性是該類的所有對象所共有的,應(yīng)當翻譯成C中的全局變量,但是需要改一個名字C+語言中類的對象聲明不加翻譯就成了C語言中相應(yīng)結(jié)構(gòu)體類型的變量聲明第12頁,共38頁。12.2 方法的編譯 將C+語言中類的非靜態(tài)方法翻譯成C語言的函數(shù),對應(yīng)的方法和函數(shù)的區(qū)別有下面幾點:函數(shù)的名字必須在原來方法名的基礎(chǔ)上修改函數(shù)聲明增加一個形參this在函數(shù)體中出現(xiàn)的函數(shù)調(diào)用也要增加一個實參在方法中對本對象的非靜態(tài)屬性的訪問,改成對this相應(yīng)域的訪問。在方法中對其它對象的非靜態(tài)屬性的訪問不必修改類的靜態(tài)方法在定義和調(diào)用的地方都需要改名第13頁,共38頁。12.2 方法的編譯 方 法 函 數(shù) 原型 返回類型 m

9、(形參表) 返回類型 fm(C &this, 形參表)調(diào)用 m(實參表)o.n(實參表)fm(this,實參表) fn(o,實參表) 屬性訪問 ko.kthis.ko.k類C的方法m被翻譯成函數(shù)fm 第14頁,共38頁。12.2 方法的編譯 類Point的方法translate翻譯成函數(shù)translate_ _5Pointddvoid translate_ _5Pointdd(Point this, double x_offset , double y_offset) this.xc += x_offset; this.yc += y _offset;第15頁,共38頁。12.3 繼承的編譯方

10、案圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle BA第16頁,共38頁。12.3 繼承的編譯方案圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPo

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

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

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

14、a Triangle B矩形A 因類A的虛方法可在類B中被重寫,又需B視圖能夠有效地從A視圖恢復矩形: 要能恢復矩形信息第21頁,共38頁。12.3 繼承的編譯方案圖形對象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B矩形A 需要編譯器為類的對象設(shè)計具有某種靈活的結(jié)構(gòu)矩形: 要能恢復矩形信息第22頁,共38頁。12.3 繼承的編譯方案#inc

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

16、th, 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 單一繼承的編譯方案第23頁,共38頁。12.3 繼承的編譯方案void zoom (GraphicalObj &obj, double zoom_factor, Point ¢er) obj.translate (center.x, center.y); / 將“中心”移至“點(0, 0)”o

17、bj.scale (zoom_factor); / 縮放如果函數(shù)zoom作用于矩形,那么zoom的體必須調(diào)用Rectangle的縮放函數(shù),而不是PolyLine甚至GraphicalObj的縮放函數(shù) 第24頁,共38頁。12.3 繼承的編譯方案編譯器怎樣有效地實現(xiàn)動態(tài)綁定?編譯器為每個類建立一個方法表,它們包含該類或它的超類中所有定義為virtual的方法的入口每個對象在C程序中有對應(yīng)的結(jié)構(gòu)體,再為這種結(jié)構(gòu)體增加一個域,該域是方法表的指針繼承類方法表的產(chǎn)生首先拷貝基類的方法表,被重新定義的方法由新的定義覆蓋然后把新引入的方法追加到這張表上第25頁,共38頁。12.3 繼承的編譯方案圖形對象的不

18、同子類的方法表GraphicalObjPolyLineRectangle length_RA scale_RA translate_PL length_PL scale_PL translate_PL scale_GO translate_GO第26頁,共38頁。12.3 繼承的編譯方案Rectangle的對象表示 length_RA scale_RA translate_PL side2_length side1_length points 視圖: GraphicalObj PolyLine RectangleRectangle 方法表第27頁,共38頁。12.3 繼承的編譯方案12.3.2

19、 重復繼承的編譯方案重復繼承對語言定義和編譯器設(shè)計來說,都具有很大的挑戰(zhàn)性B1和B2之間的沖突與矛盾重復繼承可以有多個實例只能有一個實例AB1B2C第28頁,共38頁。12.3 繼承的編譯方案B1和B2之間的沖突與矛盾這是語言定義問題,解決辦法:將B1定義為主要后代,沖突解決優(yōu)先于B1語言允許重新命名被繼承的特征語言提供顯式地手段來解決沖突B1:n或B2:n 實現(xiàn)起來并無什么困難,只涉及到編譯器符號表的組織和管理問題AB1B2C第29頁,共38頁。12.3 繼承的編譯方案重復繼承的多個實例附加(B1)AA附加(B2)附加(C)附加(B1)A附加(B2)附加(C)重復繼承的單個實例下面兩種方式都有應(yīng)用,僅討論前者第30頁,共38頁。12.3 繼承的編譯方案獨立的重復繼承的編譯方案繼承類C的對象包含基類B1和B2的完整拷貝 來自基類的繼承是相互獨立的B1B2附加(C)獨立的重復繼承時的對象結(jié)構(gòu)(程序視圖)第31頁,共

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論