




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十一章第十一章 面向?qū)ο笳Z(yǔ)言的編譯面向?qū)ο笳Z(yǔ)言的編譯本章內(nèi)容本章內(nèi)容 概述面向?qū)ο笳Z(yǔ)言的重要概念和實(shí)現(xiàn)技術(shù)概述面向?qū)ο笳Z(yǔ)言的重要概念和實(shí)現(xiàn)技術(shù) 以以C+語(yǔ)言為例,介紹如何將語(yǔ)言為例,介紹如何將C+程序翻譯成程序翻譯成C程序程序 實(shí)際的編譯器大都把實(shí)際的編譯器大都把C+程序直接翻譯成低程序直接翻譯成低級(jí)語(yǔ)言程序級(jí)語(yǔ)言程序11.1 面向?qū)ο笳Z(yǔ)言的概念面向?qū)ο笳Z(yǔ)言的概念11.1.1 對(duì)象和對(duì)象類對(duì)象和對(duì)象類 對(duì)象對(duì)象由一組由一組屬性屬性和操作于這組屬性的過(guò)程組成和操作于這組屬性的過(guò)程組成屬性到值的映射稱為對(duì)象的屬性到值的映射稱為對(duì)象的狀態(tài)狀態(tài) ,過(guò)程稱為,過(guò)程稱為方法方法 對(duì)象類對(duì)象類 一類對(duì)象的
2、總稱,一類對(duì)象的總稱,規(guī)范了該類中對(duì)象的屬性和方規(guī)范了該類中對(duì)象的屬性和方法,包括它們的類型和原型法,包括它們的類型和原型對(duì)象有自己存放屬性的存儲(chǔ)單元;對(duì)象可以共享對(duì)象有自己存放屬性的存儲(chǔ)單元;對(duì)象可以共享方法的代碼方法的代碼對(duì)象類形成了面向?qū)ο笳Z(yǔ)言的模塊單元對(duì)象類形成了面向?qū)ο笳Z(yǔ)言的模塊單元下面我們將把術(shù)語(yǔ)下面我們將把術(shù)語(yǔ)“類類”和和“類型類型”看成是同義看成是同義的的11.1 面向?qū)ο笳Z(yǔ)言的概念面向?qū)ο笳Z(yǔ)言的概念11.1.2 繼承繼承圖形對(duì)象的繼承層次結(jié)構(gòu)圖形對(duì)象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale len
3、gthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle 11.1 面向?qū)ο笳Z(yǔ)言的概念面向?qū)ο笳Z(yǔ)言的概念繼承繼承 基類、派生類、子類、抽象類基類、派生類、子類、抽象類 子類型規(guī)則子類型規(guī)則當(dāng)某個(gè)類型的一個(gè)對(duì)象在某個(gè)輸入位置被需要或作當(dāng)某個(gè)類型的一個(gè)對(duì)象在某個(gè)輸入位置被需要或作為函數(shù)的返回值時(shí),其任何子類型的對(duì)象允許出現(xiàn)為函數(shù)的返回值時(shí),其任何子類型的對(duì)象允許出現(xiàn)在這些地方。在這些地方。 類類B的一個(gè)對(duì)象,若它不同時(shí)是的一個(gè)對(duì)象,若它不同時(shí)是B的某個(gè)真子的某個(gè)真子類的對(duì)象,那么稱該對(duì)
4、象是類的對(duì)象,那么稱該對(duì)象是B的的真對(duì)象真對(duì)象,稱,稱B是該對(duì)象的是該對(duì)象的運(yùn)行時(shí)類型運(yùn)行時(shí)類型11.1 面向?qū)ο笳Z(yǔ)言的概念面向?qū)ο笳Z(yǔ)言的概念11.1.2 繼承繼承圖形對(duì)象的繼承層次結(jié)構(gòu)圖形對(duì)象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle B11.1 面向?qū)ο笳Z(yǔ)言的概念面向?qū)ο笳Z(yǔ)言的概念 方法選擇規(guī)則方法選擇規(guī)則如果類如果類B繼承類繼承類A并且
5、重寫了方法并且重寫了方法m,那么對(duì)那么對(duì)類類B的對(duì)象的對(duì)象b來(lái)說(shuō)來(lái)說(shuō), 即使它作為類即使它作為類A的對(duì)象使用的對(duì)象使用, 也必須使用在類也必須使用在類B中定義的方法中定義的方法m11.1 面向?qū)ο笳Z(yǔ)言的概念面向?qū)ο笳Z(yǔ)言的概念11.1.2 繼承繼承圖形對(duì)象的繼承層次結(jié)構(gòu)圖形對(duì)象的繼承層次結(jié)構(gòu)GraphicalObj translate scale PolyLine translate scale lengthClosedGraphics area Ellipse translate scale areaPolyGon areaRectanglearea Triangle AB11.1 面向?qū)ο笳Z(yǔ)
6、言的概念面向?qū)ο笳Z(yǔ)言的概念 動(dòng)態(tài)綁定規(guī)則動(dòng)態(tài)綁定規(guī)則當(dāng)對(duì)象當(dāng)對(duì)象o的一個(gè)方法可能被子類重新定義時(shí),的一個(gè)方法可能被子類重新定義時(shí),如果編譯器不能確定如果編譯器不能確定o的運(yùn)行時(shí)類型,那么必的運(yùn)行時(shí)類型,那么必須對(duì)該方法進(jìn)行動(dòng)態(tài)綁定須對(duì)該方法進(jìn)行動(dòng)態(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(yǔ)言的概念面向?qū)?/p>
7、象語(yǔ)言的概念11.1.3 信息封裝信息封裝 大多數(shù)面向?qū)ο笳Z(yǔ)言提供了一種機(jī)制,它可大多數(shù)面向?qū)ο笳Z(yǔ)言提供了一種機(jī)制,它可用來(lái)將類的特征分成私有的和公共的用來(lái)將類的特征分成私有的和公共的 某些面向?qū)ο笳Z(yǔ)言用不同的上下文區(qū)分作用某些面向?qū)ο笳Z(yǔ)言用不同的上下文區(qū)分作用域,如域,如“在一個(gè)類中在一個(gè)類中”、“在派生類中在派生類中”、“在友元類中在友元類中”等等等等 由編譯器來(lái)實(shí)現(xiàn)這些作用域規(guī)則是簡(jiǎn)單而又由編譯器來(lái)實(shí)現(xiàn)這些作用域規(guī)則是簡(jiǎn)單而又明顯明顯的的 11.2 方法的編譯方法的編譯 先定義一般的圖形對(duì)象類先定義一般的圖形對(duì)象類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 方法的編譯方法的編譯 將一個(gè)將一個(gè)C+語(yǔ)言的類翻譯成語(yǔ)言的類翻譯成C語(yǔ)言的程序段,主語(yǔ)言的程序段,主要工作有如下幾點(diǎn)要工作有如下幾點(diǎn)( (由繼承引出的問(wèn)題暫不考慮由繼承引
10、出的問(wèn)題暫不考慮) ) 將將C+語(yǔ)言中一個(gè)類的所有非靜態(tài)屬性構(gòu)成一語(yǔ)言中一個(gè)類的所有非靜態(tài)屬性構(gòu)成一個(gè)個(gè)C語(yǔ)言的結(jié)構(gòu)類型,取類的名字作為結(jié)構(gòu)類語(yǔ)言的結(jié)構(gòu)類型,取類的名字作為結(jié)構(gòu)類型的名字型的名字 類的靜態(tài)屬性是該類的所有對(duì)象所共有的類的靜態(tài)屬性是該類的所有對(duì)象所共有的, ,應(yīng)當(dāng)應(yīng)當(dāng)翻譯成翻譯成C中的全局變量,但是需要改一個(gè)名字中的全局變量,但是需要改一個(gè)名字 C+語(yǔ)言中類的對(duì)象聲明不加翻譯就成了語(yǔ)言中類的對(duì)象聲明不加翻譯就成了C語(yǔ)語(yǔ)言中相應(yīng)結(jié)構(gòu)類型的變量聲明言中相應(yīng)結(jié)構(gòu)類型的變量聲明11.2 方法的編譯方法的編譯 將將C+語(yǔ)言中類的非靜態(tài)方法翻譯成語(yǔ)言中類的非靜態(tài)方法翻譯成C語(yǔ)言的函語(yǔ)言的函數(shù)
11、,對(duì)應(yīng)的方法和函數(shù)的區(qū)別有下面幾點(diǎn):數(shù),對(duì)應(yīng)的方法和函數(shù)的區(qū)別有下面幾點(diǎn):函數(shù)的名字必須在原來(lái)方法名的基礎(chǔ)上修改函數(shù)的名字必須在原來(lái)方法名的基礎(chǔ)上修改函數(shù)聲明增加一個(gè)形參函數(shù)聲明增加一個(gè)形參this在函數(shù)體中出現(xiàn)的函數(shù)調(diào)用也要增加一個(gè)實(shí)參在函數(shù)體中出現(xiàn)的函數(shù)調(diào)用也要增加一個(gè)實(shí)參在方法中對(duì)本對(duì)象的非靜態(tài)屬性的訪問(wèn),改成對(duì)在方法中對(duì)本對(duì)象的非靜態(tài)屬性的訪問(wèn),改成對(duì)this相應(yīng)域的訪問(wèn)。在方法中對(duì)其它對(duì)象的非靜態(tài)相應(yīng)域的訪問(wèn)。在方法中對(duì)其它對(duì)象的非靜態(tài)屬性的訪問(wèn)不必修改屬性的訪問(wèn)不必修改 類的靜態(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í)參表) 屬性訪問(wèn)屬性訪問(wèn) 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的對(duì)象可以的對(duì)象可以用在幾乎所有類用在幾乎所有類A的對(duì)象可用的地方。的對(duì)象可用的地方。 為了使類為了使類B的對(duì)象可以作為類的對(duì)象可以作為類A的對(duì)象使用,編的對(duì)象使用,編譯器必須能以一種有效的方式產(chǎn)生類譯器必須能以一種有效的方式產(chǎn)生類B的對(duì)象的對(duì)象的的A視圖。視圖。 由于類由于類A的虛方法可以在類的虛方法可以在類B中被重寫,我們又中被重寫,我們又需要需要B視圖能夠有效地從視圖能夠有效
14、地從A視圖產(chǎn)生視圖產(chǎn)生。 這樣,編譯器要求類的對(duì)象具有某種靈活的結(jié)這樣,編譯器要求類的對(duì)象具有某種靈活的結(jié)構(gòu)。構(gòu)。 11.3 繼承的編譯方案繼承的編譯方案圖形對(duì)象的繼承層次結(jié)構(gòu)圖形對(duì)象的繼承層次結(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)動(dòng)態(tài)綁定的必須解釋編譯器是怎樣有效地實(shí)現(xiàn)動(dòng)態(tài)綁定的 編譯器為每個(gè)類建立一個(gè)方法表,它們包含一編譯器為每個(gè)類建立一個(gè)方法表,它們包含一個(gè)類或它的超類中所有定義為個(gè)類或它的超類中所有定義為virtual的方法的的方法的入口入口 每個(gè)對(duì)象在每個(gè)對(duì)象在C程序中有對(duì)應(yīng)的結(jié)構(gòu),現(xiàn)在為這程序中有對(duì)應(yīng)的結(jié)構(gòu),現(xiàn)在為這
18、樣的結(jié)構(gòu)增加一個(gè)域,該域是方法表的指針樣的結(jié)構(gòu)增加一個(gè)域,該域是方法表的指針 繼承類方法表的產(chǎn)生:首先拷貝基類的方法表繼承類方法表的產(chǎn)生:首先拷貝基類的方法表, ,被重新定義的方法由新的定義覆蓋;然后,新被重新定義的方法由新的定義覆蓋;然后,新引入的方法被追加到這張表上引入的方法被追加到這張表上11.3 繼承的編譯方案繼承的編譯方案圖形對(duì)象的不同子類的方法表圖形對(duì)象的不同子類的方法表GraphicalObjPolyLineRectangle length_RA scale_RA translate_PL length_PL scale_PL translate_PL scale_GO tran
19、slate_GO11.3 繼承的編譯方案繼承的編譯方案Rectangle的對(duì)象表示的對(duì)象表示 length_RA scale_RA translate_PL side2_length side1_length points 視圖:視圖: GraphicalObj PolyLine RectangleRectangle 方法表方法表11.3 繼承的編譯方案繼承的編譯方案11.3.2 重復(fù)繼承的編譯方案重復(fù)繼承的編譯方案重復(fù)繼承對(duì)語(yǔ)言定義和編譯器設(shè)計(jì)來(lái)說(shuō),都具重復(fù)繼承對(duì)語(yǔ)言定義和編譯器設(shè)計(jì)來(lái)說(shuō),都具有很大的挑戰(zhàn)性有很大的挑戰(zhàn)性 B1和和B2間的沖突與矛盾間的沖突與矛盾 重復(fù)繼承重復(fù)繼承可以有多個(gè)實(shí)
20、例可以有多個(gè)實(shí)例只能有一個(gè)實(shí)例只能有一個(gè)實(shí)例AB1B2C11.3 繼承的編譯方案繼承的編譯方案B1和和B2間的沖突與矛盾間的沖突與矛盾這是這是語(yǔ)言定義問(wèn)題語(yǔ)言定義問(wèn)題,解決辦法:,解決辦法: 將將B1定義為主要后代,沖突解決優(yōu)先于定義為主要后代,沖突解決優(yōu)先于B1 語(yǔ)言允許重新命名被繼承的特征語(yǔ)言允許重新命名被繼承的特征 語(yǔ)言提供顯式地手段來(lái)解決沖突語(yǔ)言提供顯式地手段來(lái)解決沖突 B1:n或或B2:n 實(shí)現(xiàn)起來(lái)并無(wú)什么困難,實(shí)現(xiàn)起來(lái)并無(wú)什么困難,只涉及到編譯器符號(hào)表的只涉及到編譯器符號(hào)表的組織和管理問(wèn)題組織和管理問(wèn)題AB1B2C11.3 繼承的編譯方案繼承的編譯方案重復(fù)繼承的多個(gè)實(shí)例重復(fù)繼承的多
21、個(gè)實(shí)例附加(附加(B1)AA附加(附加(B2)附加(附加(C)附加(附加(B1)A附加(附加(B2)附加(附加(C)重復(fù)繼承的單個(gè)實(shí)例重復(fù)繼承的單個(gè)實(shí)例下面兩種方式都有應(yīng)用,我們僅討論前者下面兩種方式都有應(yīng)用,我們僅討論前者11.3 繼承的編譯方案繼承的編譯方案獨(dú)立的重復(fù)繼承的編譯方案獨(dú)立的重復(fù)繼承的編譯方案 繼承類繼承類C的對(duì)象包含基類的對(duì)象包含基類B1和和B2的完整拷貝的完整拷貝 來(lái)自基類的繼承是相互獨(dú)來(lái)自基類的繼承是相互獨(dú)立的立的B1B2附加(附加(C)獨(dú)立的重復(fù)繼承時(shí)的獨(dú)立的重復(fù)繼承時(shí)的對(duì)象結(jié)構(gòu)(程序視圖)對(duì)象結(jié)構(gòu)(程序視圖)11.3 繼承的編譯方案繼承的編譯方案重復(fù)繼承在下述情況導(dǎo)致沖突和二義重復(fù)繼承在下述情況導(dǎo)致沖突和二義 當(dāng)多實(shí)例的特征被用于訪問(wèn)、當(dāng)多實(shí)例的特征被用于訪問(wèn)、調(diào)用和覆蓋的時(shí)候調(diào)用和覆蓋的時(shí)候 當(dāng)類當(dāng)類C的對(duì)象的的對(duì)象的A視圖被建立視圖被建立時(shí)。因?yàn)轭悤r(shí)。因?yàn)轭怌的對(duì)象包含多個(gè)的對(duì)象包含多個(gè)類類A子對(duì)象子對(duì)象 可見(jiàn)性規(guī)則可以在某些情可見(jiàn)性規(guī)則可以在某些情況下幫助避免這些困難況下幫助避免這些困難 B1B2附加(附加(C)獨(dú)立的重復(fù)繼承時(shí)的獨(dú)立的重復(fù)繼
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 戰(zhàn)略領(lǐng)導(dǎo)力與風(fēng)險(xiǎn)防范試題及答案
- 網(wǎng)絡(luò)管理員考試關(guān)鍵試題及答案分析
- 行政管理行業(yè)趨勢(shì)試題及答案分享
- 2025至2030年中國(guó)數(shù)碼床套行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國(guó)密閉容器/管道消毒設(shè)備行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國(guó)下導(dǎo)輪行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年中國(guó)門禁外殼市場(chǎng)調(diào)查研究報(bào)告
- 法學(xué)領(lǐng)域中的學(xué)術(shù)爭(zhēng)鳴試題及答案
- 網(wǎng)絡(luò)管理員的專業(yè)能力提升試題及答案
- 2025年中國(guó)鎳硅鐵合金市場(chǎng)調(diào)查研究報(bào)告
- 受處分以來(lái)的思想工作生活情況【4篇】
- 課件:第四章 社會(huì)工作項(xiàng)目的執(zhí)行(《社會(huì)工作項(xiàng)目策劃與評(píng)估》課程)
- 冷庫(kù)施工組織設(shè)計(jì)施工方案
- 登桿作業(yè)課件共
- 吸痰技能操作及評(píng)分標(biāo)準(zhǔn)(評(píng)分表)
- 尼可地爾調(diào)研
- 發(fā)酵法生物制氫技術(shù)課件
- 機(jī)械制造技術(shù)基礎(chǔ)(第7章完成)課件
- 主動(dòng)脈夾層護(hù)理查房-PPT課件
- 2022年江蘇省衛(wèi)生系統(tǒng)事業(yè)單位考試(護(hù)理學(xué)專業(yè)知識(shí))參考題庫(kù)匯總(含答案)
- 危急值放射科ppt課件
評(píng)論
0/150
提交評(píng)論