版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、會(huì)計(jì)學(xué)1C語(yǔ)言試題、學(xué)習(xí)、考試大全語(yǔ)言試題、學(xué)習(xí)、考試大全13.1 函數(shù)重載函數(shù)重載 13.2 運(yùn)算符重載運(yùn)算符重載 13.3 靜態(tài)聯(lián)編?kù)o態(tài)聯(lián)編 13.4 動(dòng)態(tài)聯(lián)編和虛函數(shù)動(dòng)態(tài)聯(lián)編和虛函數(shù) 13.5 純虛函數(shù)和抽象類(lèi)純虛函數(shù)和抽象類(lèi) 第1頁(yè)/共57頁(yè)第第 13 章章 多態(tài)性多態(tài)性 多態(tài)性是實(shí)現(xiàn)多態(tài)性是實(shí)現(xiàn) OOP 的關(guān)鍵技術(shù)之一。的關(guān)鍵技術(shù)之一。 在在C+中,多態(tài)性分為兩種:中,多態(tài)性分為兩種: 靜態(tài)多態(tài)靜態(tài)多態(tài) 動(dòng)態(tài)多態(tài)動(dòng)態(tài)多態(tài) 函數(shù)重載和運(yùn)算符重載屬于靜態(tài)多態(tài)。函數(shù)重載和運(yùn)算符重載屬于靜態(tài)多態(tài)。函數(shù)重載:相同函數(shù)名可以完成不同功能。函數(shù)重載:相同函數(shù)名可以完成不同功能。運(yùn)算符重載:相同運(yùn)算
2、符完成不同功能。運(yùn)算符重載:相同運(yùn)算符完成不同功能。 動(dòng)態(tài)多態(tài)動(dòng)態(tài)多態(tài)是指:程序執(zhí)行過(guò)程中確定的關(guān)系,是指:程序執(zhí)行過(guò)程中確定的關(guān)系, 如動(dòng)態(tài)確定函數(shù)的調(diào)用關(guān)系。如動(dòng)態(tài)確定函數(shù)的調(diào)用關(guān)系。 運(yùn)行時(shí)的多態(tài)(動(dòng)態(tài)多態(tài))運(yùn)行時(shí)的多態(tài)(動(dòng)態(tài)多態(tài)) 是通過(guò)類(lèi)的繼承和虛函數(shù)來(lái)實(shí)現(xiàn)的。是通過(guò)類(lèi)的繼承和虛函數(shù)來(lái)實(shí)現(xiàn)的。第2頁(yè)/共57頁(yè)13.1 函數(shù)重載函數(shù)重載 參見(jiàn)參見(jiàn)5.6節(jié)(略)節(jié)(略) 13.2 重載運(yùn)算符重載運(yùn)算符 C+中所有的運(yùn)算符都已預(yù)先定義了用法及意義。中所有的運(yùn)算符都已預(yù)先定義了用法及意義。 如:如:+ * / = 等,適用于已有的數(shù)據(jù)類(lèi)型。等,適用于已有的數(shù)據(jù)類(lèi)型。 已定義的已定義的用法及意
3、義是不允許用戶(hù)改變的。用法及意義是不允許用戶(hù)改變的。 如果用戶(hù)定義了新的數(shù)據(jù)類(lèi)型,希望已定義的運(yùn)算符如果用戶(hù)定義了新的數(shù)據(jù)類(lèi)型,希望已定義的運(yùn)算符 能適應(yīng)新的數(shù)據(jù)類(lèi)型,能適應(yīng)新的數(shù)據(jù)類(lèi)型, 如如: 前述前述 Complex 類(lèi)的加法運(yùn)算類(lèi)的加法運(yùn)算Complex c1, c2, c3;c3 = add(c1, c2); /以前通過(guò)函數(shù)實(shí)現(xiàn)加法運(yùn)算以前通過(guò)函數(shù)實(shí)現(xiàn)加法運(yùn)算c2.add(c3); / 或或通過(guò)成員函數(shù)實(shí)現(xiàn)通過(guò)成員函數(shù)實(shí)現(xiàn)c3 = c1 + c2; /能否直觀地寫(xiě)成這樣?能否直觀地寫(xiě)成這樣?能能 ! 運(yùn)算符的重載可以達(dá)到此目的。運(yùn)算符的重載可以達(dá)到此目的。第3頁(yè)/共57頁(yè) 允許重載允
4、許重載 和和 不允許重載不允許重載的運(yùn)算符見(jiàn)的運(yùn)算符見(jiàn)13-1和和13-2表。表。13.2.1 運(yùn)算符重載的幾點(diǎn)說(shuō)明運(yùn)算符重載的幾點(diǎn)說(shuō)明重載運(yùn)算符的限制重載運(yùn)算符的限制(1)只能對(duì)已有運(yùn)算符重載,不可臆造新的運(yùn)算符。)只能對(duì)已有運(yùn)算符重載,不可臆造新的運(yùn)算符。(2)不允許改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。)不允許改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。(3)不允許改變運(yùn)算符的語(yǔ)法結(jié)構(gòu),)不允許改變運(yùn)算符的語(yǔ)法結(jié)構(gòu), 如二元運(yùn)算符只能重載成二元運(yùn)算符,如二元運(yùn)算符只能重載成二元運(yùn)算符, 一元運(yùn)算符只能重載成一元運(yùn)算符。一元運(yùn)算符只能重載成一元運(yùn)算符。第4頁(yè)/共57頁(yè)1.重載為類(lèi)的成員函數(shù)重載為類(lèi)的成員函數(shù) 在類(lèi)內(nèi)
5、定義運(yùn)算符重載函數(shù)的格式為:在類(lèi)內(nèi)定義運(yùn)算符重載函數(shù)的格式為: operator ( ) 以以 operator 為關(guān)鍵字,編譯器可以很容易將為關(guān)鍵字,編譯器可以很容易將運(yùn)算符重載函數(shù)與其他成員函數(shù)區(qū)別開(kāi)來(lái)。運(yùn)算符重載函數(shù)與其他成員函數(shù)區(qū)別開(kāi)來(lái)。例例13.2 實(shí)現(xiàn)復(fù)數(shù)類(lèi)的實(shí)現(xiàn)復(fù)數(shù)類(lèi)的“+”,“-”等重載運(yùn)算等重載運(yùn)算 關(guān)鍵部分見(jiàn)下頁(yè)關(guān)鍵部分見(jiàn)下頁(yè)13.2.2 運(yùn)算符重載的兩種方式運(yùn)算符重載的兩種方式在類(lèi)外定義運(yùn)算符重載函數(shù)的格式為:在類(lèi)外定義運(yùn)算符重載函數(shù)的格式為: :operator ( )特殊的成員函數(shù)名特殊的成員函數(shù)名第5頁(yè)/共57頁(yè)class Complex float Real, I
6、mage;public: . Complex operator +(const Complex &c); Complex operator +(double); Complex operator-(const Complex &c); Complex operator-(double); Complex operator-(void); . ;Complex Complex:operator +(const Complex &c) return Complex (Real+c.Real, Image+c.Image); Complex Complex:operator +(double r)
7、return Complex(Real+r, Image); Complex Complex:operator-(void) return Complex(-Real, -Image); 第6頁(yè)/共57頁(yè)void main( ) Complex c1(2, 3), c2(4, -2), c3; c3 = c1+c2 ; c3 = c1+5 ; c3 = - c1; 編譯器將編譯器將 c1+c2 解釋為:解釋為:c1.operator+(c2)將將 c1+5 解釋為:解釋為:c1.operator+(5)第第1個(gè)運(yùn)算量是對(duì)象,第個(gè)運(yùn)算量是對(duì)象,第2個(gè)運(yùn)算量是參數(shù)。個(gè)運(yùn)算量是參數(shù)。閱讀教材上程序全
8、文閱讀教材上程序全文(講解略)(講解略)將將 - c1 解釋為:解釋為:c1.operator( ) 當(dāng)用成員函數(shù)實(shí)現(xiàn)運(yùn)算符的重載時(shí),重載函數(shù)的當(dāng)用成員函數(shù)實(shí)現(xiàn)運(yùn)算符的重載時(shí),重載函數(shù)的 參數(shù)個(gè)數(shù)只能是參數(shù)個(gè)數(shù)只能是 0 個(gè)或個(gè)或 1 個(gè)。分別實(shí)現(xiàn):一元、二元個(gè)。分別實(shí)現(xiàn):一元、二元 運(yùn)算符的重載。運(yùn)算符的重載。第7頁(yè)/共57頁(yè)2.重載為友元函數(shù)重載為友元函數(shù) 例例13.3 用友元函數(shù)實(shí)現(xiàn)復(fù)數(shù)類(lèi)的用友元函數(shù)實(shí)現(xiàn)復(fù)數(shù)類(lèi)的“+”和和“” 重載運(yùn)算重載運(yùn)算 關(guān)鍵部分見(jiàn)下頁(yè)關(guān)鍵部分見(jiàn)下頁(yè)在在類(lèi)內(nèi)類(lèi)內(nèi)定義友元重載函數(shù)的格式為:定義友元重載函數(shù)的格式為:friend operator ( )在在類(lèi)外類(lèi)外定
9、義友元重載函數(shù)的格式為:定義友元重載函數(shù)的格式為: operator ( )第8頁(yè)/共57頁(yè)class Complex float Real, Image;public: . friend Complex operator +(const Complex &c1, const Complex &c2); friend Complex operator(const Complex &c); . ;Complex operator +(const Complex &c1, const Complex &c2)/二元運(yùn)算二元運(yùn)算 Complex t; t.Real=c1.Real+c2.Real;
10、t.Image=c1.Image+c2.Image; return t;Complex operator(const Complex c) /一元運(yùn)算一元運(yùn)算 return Complex(c.Real, c.Image) ;不是類(lèi)的成員函數(shù)不是類(lèi)的成員函數(shù)在在 main( )函數(shù)中函數(shù)中,若有若有 Complex c1,c2; 則編譯器將則編譯器將 c1+c2 解釋為:解釋為:operator+(c1, c2)將將 c1 解釋為:解釋為:operator(c1)第9頁(yè)/共57頁(yè)閱讀教材上程序全文閱讀教材上程序全文(講解略)(講解略) 當(dāng)用友元函數(shù)實(shí)現(xiàn)運(yùn)算符的重載時(shí),重載函數(shù)的當(dāng)用友元函數(shù)實(shí)現(xiàn)
11、運(yùn)算符的重載時(shí),重載函數(shù)的 參數(shù)個(gè)數(shù)只能是參數(shù)個(gè)數(shù)只能是1 個(gè)或個(gè)或 2 個(gè)。個(gè)。 分別實(shí)現(xiàn):分別實(shí)現(xiàn):一元一元運(yùn)算符重載、運(yùn)算符重載、二元二元運(yùn)算符重載運(yùn)算符重載3.兩種重載方式的比較兩種重載方式的比較 成員實(shí)現(xiàn):成員實(shí)現(xiàn):將將 c1+c2 解釋為:解釋為:c1.operator +(c2)友元實(shí)現(xiàn):友元實(shí)現(xiàn):將將 c1+c2 解釋為:解釋為:operator +(c1, c2)成員實(shí)現(xiàn):成員實(shí)現(xiàn):將將 c1+5.6 解釋為:解釋為:c1.operator +(5.6)友元實(shí)現(xiàn):友元實(shí)現(xiàn):將將 c1+5.6 解釋為:解釋為:operator +(c1, 5.6)成員實(shí)現(xiàn):成員實(shí)現(xiàn):將將 5.
12、6 + c1解釋為:解釋為: 5.6.operator + (c1) 友元實(shí)現(xiàn):友元實(shí)現(xiàn):將將 5.6 + c1解釋為:解釋為:operator + ( 5.6, c1)第10頁(yè)/共57頁(yè)因此:因此:對(duì)一般的二元運(yùn)算符重載為友元函數(shù)比重載為成員函對(duì)一般的二元運(yùn)算符重載為友元函數(shù)比重載為成員函數(shù)更優(yōu)越。數(shù)更優(yōu)越。但是對(duì)于賦值運(yùn)算符,將其重載為成員函數(shù)較好,因但是對(duì)于賦值運(yùn)算符,將其重載為成員函數(shù)較好,因?yàn)橘x值運(yùn)算符是一個(gè)二元運(yùn)算符,為賦值運(yùn)算符是一個(gè)二元運(yùn)算符,其語(yǔ)法格式為其語(yǔ)法格式為 =,第一個(gè)運(yùn)算量必須是對(duì)象(變量也是對(duì)象),通過(guò)對(duì)象第一個(gè)運(yùn)算量必須是對(duì)象(變量也是對(duì)象),通過(guò)對(duì)象調(diào)用成員函
13、數(shù)比較自然。調(diào)用成員函數(shù)比較自然。若重載為友元,則可能會(huì)出現(xiàn)若重載為友元,則可能會(huì)出現(xiàn)5.6=c這樣的表達(dá)式,與這樣的表達(dá)式,與賦值表達(dá)式的語(yǔ)義不一致。賦值表達(dá)式的語(yǔ)義不一致。 第11頁(yè)/共57頁(yè)定義友元的目的是在友元函數(shù)中直接訪問(wèn)類(lèi)的私有成員,定義友元的目的是在友元函數(shù)中直接訪問(wèn)類(lèi)的私有成員,實(shí)際上,也可以通過(guò)公有函數(shù)接口訪問(wèn)類(lèi)的私有成員,實(shí)際上,也可以通過(guò)公有函數(shù)接口訪問(wèn)類(lèi)的私有成員,所以所以實(shí)現(xiàn)運(yùn)算符重載,可以即不用成員函數(shù),實(shí)現(xiàn)運(yùn)算符重載,可以即不用成員函數(shù),也不用友元函數(shù)。也不用友元函數(shù)。class Complex float Real, Image;public: Complex(
14、double r=0, double i=0) Real=r; Image=i; void SetReal(double Real) Complex:Real = Real; void SetImage(double Image) Complex:Image = Image; double GetReal( ) return(Real); double GetImage( ) return(Image); ; 4.使用非成員、非友元實(shí)現(xiàn)運(yùn)算符的重載使用非成員、非友元實(shí)現(xiàn)運(yùn)算符的重載例例13.4:第12頁(yè)/共57頁(yè)Complex operator +(Complex &c1, Complex &
15、c2) /二元運(yùn)算二元運(yùn)算 Complex t; t.SetReal( c1.GetReal( )+c2.GetReal( ) ); t.SetImage( c1.GetImage( )+c2.GetImage( ) ); return t; void main( )Complex c1(2, 3), c2(4, 8), c3;c3 = c1+c2;c3.Show( );編譯器將編譯器將 c1+c2 解釋為:解釋為:operator +(c1, c2)第13頁(yè)/共57頁(yè)對(duì)于對(duì)于Complex類(lèi),如有類(lèi),如有Complex c1(2, 3), c2; 則自動(dòng)將則自動(dòng)將 c2=c1; 處理成:處理
16、成: c2.Real = c1.Real; c2.Image = c1. Image; 一般不會(huì)出現(xiàn)問(wèn)題。一般不會(huì)出現(xiàn)問(wèn)題。 5. 何時(shí)必須重載何時(shí)必須重載 = 和和 += 運(yùn)算符?運(yùn)算符? 相同類(lèi)型的對(duì)象之間是可以直接賦值的,相同類(lèi)型的對(duì)象之間是可以直接賦值的,C+將賦將賦值處理成兩個(gè)對(duì)象的各個(gè)成員直接賦值。兩個(gè)對(duì)象值處理成兩個(gè)對(duì)象的各個(gè)成員直接賦值。兩個(gè)對(duì)象的對(duì)應(yīng)數(shù)據(jù)成員逐一賦值。的對(duì)應(yīng)數(shù)據(jù)成員逐一賦值。例例13.5 在類(lèi)中,用字符數(shù)組實(shí)現(xiàn)字符串。在類(lèi)中,用字符數(shù)組實(shí)現(xiàn)字符串。 見(jiàn)見(jiàn) “第第13章章 多態(tài)性多態(tài)性(例子例子).doc”第14頁(yè)/共57頁(yè)Num數(shù)組數(shù)組Name數(shù)組數(shù)組Scor
17、e整數(shù)整數(shù)stud1存儲(chǔ)空間存儲(chǔ)空間Num數(shù)組數(shù)組Name數(shù)組數(shù)組Score整數(shù)整數(shù)stud2存儲(chǔ)空間存儲(chǔ)空間程序中程序中A行使用賦值運(yùn)算符進(jìn)行對(duì)象整體賦值,行使用賦值運(yùn)算符進(jìn)行對(duì)象整體賦值, C+將其處理成各個(gè)成員逐一賦值將其處理成各個(gè)成員逐一賦值,如下圖所示:如下圖所示: :C+默認(rèn)的處理是:默認(rèn)的處理是:strcpy(stud2.Num, stud1.Num); strcpy(stud2.Name, stud1.Name); stud2.Score = stud1.Score; 。 但是如果對(duì)象的成員中有成員指向動(dòng)態(tài)分配的但是如果對(duì)象的成員中有成員指向動(dòng)態(tài)分配的 數(shù)據(jù)空間就會(huì)出現(xiàn)問(wèn)題。數(shù)
18、據(jù)空間就會(huì)出現(xiàn)問(wèn)題。 第15頁(yè)/共57頁(yè)例例13.6 在類(lèi)中,用指針實(shí)現(xiàn)字符串,在類(lèi)中,用指針實(shí)現(xiàn)字符串, 即字符串的空間是動(dòng)態(tài)分配的。即字符串的空間是動(dòng)態(tài)分配的。 class Studentchar *Nump; /學(xué)號(hào),注意:用指針實(shí)現(xiàn)學(xué)號(hào),注意:用指針實(shí)現(xiàn)char *Namep; /姓名,注意:用指針實(shí)現(xiàn)姓名,注意:用指針實(shí)現(xiàn)int Score; /成績(jī)成績(jī)public: Student(char *nump=NULL, char *namep=NULL, int score=0) if(nump) /構(gòu)造函數(shù)構(gòu)造函數(shù) Nump = new charstrlen(nump)+1;strc
19、py(Nump, nump); /動(dòng)態(tài)分配存儲(chǔ)空間動(dòng)態(tài)分配存儲(chǔ)空間 else Nump=NULL; if(namep) Score=score;第16頁(yè)/共57頁(yè)Student( ) / 析構(gòu)函數(shù),釋放指針指向的空間析構(gòu)函數(shù),釋放指針指向的空間 if(Nump)delete Nump;if(Namep)delete Namep;void Show( ) if(Nump & Namep) coutNum=NumptName=NameptScore=Scoreendl;第17頁(yè)/共57頁(yè)void main( )Student stud1(01201, Mary, 88), stud2;stud2=
20、stud1; /Astud1.Show( );stud2.Show( );cout.flush( ); /BNump指針指針Namep指針指針Score整數(shù)整數(shù)stud2存儲(chǔ)空間存儲(chǔ)空間Nump指針指針Namep指針指針Score整數(shù)整數(shù)stud1存儲(chǔ)空間存儲(chǔ)空間01201Mary首先撤消對(duì)象首先撤消對(duì)象stud2,然后撤消對(duì)象,然后撤消對(duì)象stud1 ,出問(wèn),出問(wèn)題!題!同一對(duì)象被撤銷(xiāo)兩次。同一對(duì)象被撤銷(xiāo)兩次。 編譯器將編譯器將A行處理成:行處理成:第18頁(yè)/共57頁(yè)解決辦法,在類(lèi)中增加賦值解決辦法,在類(lèi)中增加賦值 = 重載函數(shù):重載函數(shù):Student & operator=(const
21、Student &stud) / 返回值為對(duì)象自身的引用返回值為對(duì)象自身的引用 if(Nump)delete Nump; / C 釋放對(duì)象自身的原串空間釋放對(duì)象自身的原串空間 if(Namep)delete Namep; / D 釋放對(duì)象自身的原串空間釋放對(duì)象自身的原串空間 if(stud.Nump) / 根據(jù)賦值對(duì)象的空間大小給被賦值對(duì)象分配空間根據(jù)賦值對(duì)象的空間大小給被賦值對(duì)象分配空間 Nump = new charstrlen(stud.Nump)+1;strcpy(Nump, stud.Nump); else Nump=NULL; if(stud.Namep) / 根據(jù)賦值對(duì)象的空間大
22、小給被賦值對(duì)象分配空間根據(jù)賦值對(duì)象的空間大小給被賦值對(duì)象分配空間 Namep = new charstrlen(stud.Namep)+1;strcpy(Namep, stud.Namep); else Namep=NULL; Score=stud.Score; return *this; / *this是對(duì)象自身是對(duì)象自身 第19頁(yè)/共57頁(yè)Nump指針指針Namep指針指針Score整數(shù)整數(shù)stud2存儲(chǔ)空間存儲(chǔ)空間Nump指針指針Namep指針指針Score整數(shù)整數(shù)stud1存儲(chǔ)空間存儲(chǔ)空間01201Mary01201Mary在賦值時(shí),為目的對(duì)象的指針重新分配指向的字符在賦值時(shí),為目的對(duì)
23、象的指針重新分配指向的字符串空間。串空間。增加賦值增加賦值 = 重載函數(shù)后,對(duì)象賦值后的存儲(chǔ)空間如重載函數(shù)后,對(duì)象賦值后的存儲(chǔ)空間如下:下:這樣,程序結(jié)束時(shí),分別撤銷(xiāo)兩個(gè)對(duì)象,程序正確這樣,程序結(jié)束時(shí),分別撤銷(xiāo)兩個(gè)對(duì)象,程序正確運(yùn)行!運(yùn)行!第20頁(yè)/共57頁(yè)6對(duì)于對(duì)于+=(或(或=)運(yùn)算符,重載函數(shù)的返回值為)運(yùn)算符,重載函數(shù)的返回值為void類(lèi)型或本類(lèi)類(lèi)型對(duì)象的區(qū)別類(lèi)型或本類(lèi)類(lèi)型對(duì)象的區(qū)別 例例13.7 見(jiàn)見(jiàn) “第第13章章 多態(tài)性多態(tài)性(例子例子).doc”若重載為返回若重載為返回void類(lèi)型,則本類(lèi)對(duì)象不可連續(xù)賦值類(lèi)型,則本類(lèi)對(duì)象不可連續(xù)賦值。若重載為返回本類(lèi)類(lèi)型,則本類(lèi)對(duì)象可以連續(xù)賦值
24、若重載為返回本類(lèi)類(lèi)型,則本類(lèi)對(duì)象可以連續(xù)賦值。第21頁(yè)/共57頁(yè)7對(duì)于對(duì)于+=(或(或=)運(yùn)算符,返回本類(lèi)對(duì)象與返回)運(yùn)算符,返回本類(lèi)對(duì)象與返回本類(lèi)對(duì)象的引用的區(qū)別本類(lèi)對(duì)象的引用的區(qū)別 比較下面兩例,先看比較下面兩例,先看第一個(gè)例子:第一個(gè)例子: Complex Complex :operator+=(const Complex &c) Real+=c.Real; Image+=c.Image; return *this; 此函數(shù)的返回值為本類(lèi)對(duì)象,此函數(shù)的返回值為本類(lèi)對(duì)象,C+的處理是:用返的處理是:用返回的對(duì)象值回的對(duì)象值*this初始化內(nèi)存臨時(shí)對(duì)象(調(diào)用拷貝構(gòu)初始化內(nèi)存臨時(shí)對(duì)象(調(diào)用拷貝
25、構(gòu)造函數(shù)),從本函數(shù)返回后,造函數(shù)),從本函數(shù)返回后,用內(nèi)存臨時(shí)對(duì)象作為用內(nèi)存臨時(shí)對(duì)象作為調(diào)用函數(shù)的結(jié)果。調(diào)用函數(shù)的結(jié)果。 第22頁(yè)/共57頁(yè)再看第二個(gè)例子:再看第二個(gè)例子:Complex Complex :operator+=(const Complex &c) Real+=c.Real; Image+=c.Image; Complex temp = *this ;return temp;C+的處理是:調(diào)用拷貝構(gòu)造函數(shù),用返回的對(duì)象的處理是:調(diào)用拷貝構(gòu)造函數(shù),用返回的對(duì)象值值temp初始化內(nèi)存臨時(shí)對(duì)象,初始化內(nèi)存臨時(shí)對(duì)象,內(nèi)存臨時(shí)對(duì)象作為調(diào)內(nèi)存臨時(shí)對(duì)象作為調(diào)用函數(shù)的結(jié)果。用函數(shù)的結(jié)果。 第2
26、3頁(yè)/共57頁(yè)從上面兩個(gè)小例子可以看出,從上面兩個(gè)小例子可以看出,若重載函數(shù)返回對(duì)象值若重載函數(shù)返回對(duì)象值,則返回則返回*this和返回和返回temp均可。均可。但要注意,但要注意,因?yàn)榉祷貙?duì)象值時(shí)需要調(diào)用拷貝構(gòu)造函數(shù)因?yàn)榉祷貙?duì)象值時(shí)需要調(diào)用拷貝構(gòu)造函數(shù)初始化內(nèi)存臨時(shí)對(duì)象,因此若對(duì)象有動(dòng)態(tài)分配的存儲(chǔ)初始化內(nèi)存臨時(shí)對(duì)象,因此若對(duì)象有動(dòng)態(tài)分配的存儲(chǔ)空間,就必須定義拷貝構(gòu)造函數(shù)。空間,就必須定義拷貝構(gòu)造函數(shù)。 第24頁(yè)/共57頁(yè)第三個(gè)例子:第三個(gè)例子: Complex & Complex :operator+=(const Complex &c) Real+=c.Real; Image+=c.Ima
27、ge;return *this; 本例的返回值為本類(lèi)對(duì)象的引用,本例的返回值為本類(lèi)對(duì)象的引用,不需初始化內(nèi)存臨時(shí)不需初始化內(nèi)存臨時(shí)對(duì)象,對(duì)象,返回值是對(duì)象自身,即返回值是對(duì)象自身,即*this。因?yàn)椴恍枰跏蓟?。因?yàn)椴恍枰跏蓟瘍?nèi)存臨時(shí)對(duì)象,效率較高,所以像內(nèi)存臨時(shí)對(duì)象,效率較高,所以像 +=、= 等改變對(duì)象值等改變對(duì)象值的重載函數(shù)最好返回對(duì)象的引用。的重載函數(shù)最好返回對(duì)象的引用。 第25頁(yè)/共57頁(yè)第四個(gè)例子:第四個(gè)例子:Complex & Complex :operator+=(const Complex &c) Real+=c.Real; Image += c.Image; Comple
28、x temp = *this ;return temp;此時(shí),此時(shí),出現(xiàn)問(wèn)題。出現(xiàn)問(wèn)題。因?yàn)榉祷氐氖菍?duì)象的引用(即對(duì)象自因?yàn)榉祷氐氖菍?duì)象的引用(即對(duì)象自身,不借助于內(nèi)存臨時(shí)對(duì)象),系統(tǒng)要求在執(zhí)行流程返身,不借助于內(nèi)存臨時(shí)對(duì)象),系統(tǒng)要求在執(zhí)行流程返回到調(diào)用處時(shí),返回值是存在的。但是本例返回值是函回到調(diào)用處時(shí),返回值是存在的。但是本例返回值是函數(shù)內(nèi)部的局部對(duì)象數(shù)內(nèi)部的局部對(duì)象temp,而局部對(duì)象在函數(shù)返回前,其,而局部對(duì)象在函數(shù)返回前,其空間是被撤消的。空間是被撤消的。第26頁(yè)/共57頁(yè)結(jié)論:結(jié)論: 返回本類(lèi)對(duì)象時(shí),可以用對(duì)象自身和局部對(duì)象做為返回返回本類(lèi)對(duì)象時(shí),可以用對(duì)象自身和局部對(duì)象做為返回
29、值(有時(shí)需要定義拷貝構(gòu)造函數(shù))。值(有時(shí)需要定義拷貝構(gòu)造函數(shù))。 返回對(duì)象的引用時(shí),不能用局部對(duì)象做為返回值。返回對(duì)象的引用時(shí),不能用局部對(duì)象做為返回值。例例13.8對(duì)于字符串類(lèi),重載對(duì)于字符串類(lèi),重載 = 運(yùn)算符,返回對(duì)象自身運(yùn)算符,返回對(duì)象自身的引用。就本例而言,可以不定義拷貝構(gòu)造函數(shù),程的引用。就本例而言,可以不定義拷貝構(gòu)造函數(shù),程序能正確運(yùn)行。序能正確運(yùn)行。 見(jiàn)見(jiàn) “第第13章章 多態(tài)性多態(tài)性(例子例子).doc”第27頁(yè)/共57頁(yè)8.調(diào)用調(diào)用拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù) 和和 調(diào)用調(diào)用賦值運(yùn)算符重載函數(shù)賦值運(yùn)算符重載函數(shù)的時(shí)機(jī)的時(shí)機(jī) class Complexdouble Real, I
30、mage;public:Complex(double r=0, double i=0) / 構(gòu)造函數(shù)構(gòu)造函數(shù) Real=r; Image=i; Complex(Complex &c) / 拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù) Real=c.Real; Image=c.Image; coutCall copy Real Imagen; ;void main( )Complex c1(2, 3), c2(4, -2);Complex c3=c1; c1=c2; 程序的運(yùn)行結(jié)果是?程序的運(yùn)行結(jié)果是?調(diào)用了拷貝構(gòu)造函數(shù)調(diào)用了拷貝構(gòu)造函數(shù)未調(diào)用拷貝構(gòu)造函數(shù)未調(diào)用拷貝構(gòu)造函數(shù)Call copy 2 3v只有在產(chǎn)生新對(duì)
31、象時(shí),調(diào)用構(gòu)造函數(shù)。只有在產(chǎn)生新對(duì)象時(shí),調(diào)用構(gòu)造函數(shù)。v用已有對(duì)象初始化新產(chǎn)生的對(duì)象時(shí),用已有對(duì)象初始化新產(chǎn)生的對(duì)象時(shí), 調(diào)用拷貝構(gòu)造函數(shù)。調(diào)用拷貝構(gòu)造函數(shù)。v賦值運(yùn)算賦值運(yùn)算 = , 不調(diào)用拷貝構(gòu)造函數(shù)。不調(diào)用拷貝構(gòu)造函數(shù)。第28頁(yè)/共57頁(yè)13.2.3 類(lèi)型轉(zhuǎn)換函數(shù)將本類(lèi)對(duì)象轉(zhuǎn)換成其他類(lèi)對(duì)類(lèi)型轉(zhuǎn)換函數(shù)將本類(lèi)對(duì)象轉(zhuǎn)換成其他類(lèi)對(duì)象象 例例: Complex c(3, 2); double x=6.2;如果有如果有: c=x; /類(lèi)型不一致類(lèi)型不一致 或或: x=c; /類(lèi)型不一致類(lèi)型不一致則系統(tǒng)自動(dòng)處理為則系統(tǒng)自動(dòng)處理為: c = Complex(x); /需作類(lèi)型轉(zhuǎn)換需作類(lèi)型轉(zhuǎn)換 x = d
32、ouble(c); /需作類(lèi)型轉(zhuǎn)換需作類(lèi)型轉(zhuǎn)換對(duì)于,通過(guò)以前所學(xué)的對(duì)于,通過(guò)以前所學(xué)的構(gòu)造函數(shù)構(gòu)造函數(shù)實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換,實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換, 將其他類(lèi)型的數(shù)據(jù)轉(zhuǎn)換成本類(lèi)數(shù)據(jù)將其他類(lèi)型的數(shù)據(jù)轉(zhuǎn)換成本類(lèi)數(shù)據(jù)。對(duì)于,使用本節(jié)將介紹的類(lèi)型轉(zhuǎn)換對(duì)于,使用本節(jié)將介紹的類(lèi)型轉(zhuǎn)換運(yùn)算符重載函數(shù)運(yùn)算符重載函數(shù), 將本類(lèi)數(shù)據(jù)轉(zhuǎn)換成將本類(lèi)數(shù)據(jù)轉(zhuǎn)換成其他類(lèi)型的數(shù)據(jù)。其他類(lèi)型的數(shù)據(jù)。構(gòu)造函數(shù):構(gòu)造函數(shù):Complex:Complex(double r) real = r ; image = 0; 第29頁(yè)/共57頁(yè)定義類(lèi)型轉(zhuǎn)換函數(shù)定義類(lèi)型轉(zhuǎn)換函數(shù): 功能:功能:將將 類(lèi)對(duì)象自動(dòng)轉(zhuǎn)換成類(lèi)對(duì)象自動(dòng)轉(zhuǎn)換成 類(lèi)型對(duì)象類(lèi)型對(duì)象類(lèi)型轉(zhuǎn)換函數(shù)
33、只能用成員函數(shù)實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換函數(shù)只能用成員函數(shù)實(shí)現(xiàn), 不能用友元函數(shù)實(shí)現(xiàn)。不能用友元函數(shù)實(shí)現(xiàn)。在類(lèi)內(nèi)定義類(lèi)型轉(zhuǎn)換函數(shù)的一般格式為:在類(lèi)內(nèi)定義類(lèi)型轉(zhuǎn)換函數(shù)的一般格式為:operator ( ) . 在類(lèi)外定義類(lèi)型轉(zhuǎn)換函數(shù)的一般格式為:在類(lèi)外定義類(lèi)型轉(zhuǎn)換函數(shù)的一般格式為: : operator ( ) . 該函數(shù)不能有參數(shù),該函數(shù)不能有參數(shù),不能寫(xiě)返回值類(lèi)型,不能寫(xiě)返回值類(lèi)型, 因返回值類(lèi)型已確定。因返回值類(lèi)型已確定。第30頁(yè)/共57頁(yè)例例13.10 類(lèi)型轉(zhuǎn)換函數(shù)的定義和使用類(lèi)型轉(zhuǎn)換函數(shù)的定義和使用 #include class Complexdouble Real, Image;public:Co
34、mplex(double r=0, double i=0) Real=r; Image=i; operator double ( ) / A 類(lèi)型轉(zhuǎn)換函數(shù),類(lèi)型轉(zhuǎn)換函數(shù), / 將將 Complex 類(lèi)轉(zhuǎn)換成類(lèi)轉(zhuǎn)換成 double 類(lèi)類(lèi) return Real; ;void main( ) Complex c(3,2);double x;x = c; / B cout x= x endl;/ 即即 x = double (c) ;系統(tǒng)自動(dòng)處理為系統(tǒng)自動(dòng)處理為 x = c.operator double( );第31頁(yè)/共57頁(yè)例例13.11 成員函數(shù)和類(lèi)型轉(zhuǎn)換函數(shù)的比較成員函數(shù)和類(lèi)型轉(zhuǎn)換函數(shù)的比
35、較見(jiàn)見(jiàn) “第第13章章 多態(tài)性多態(tài)性(例子例子).doc”其中主函數(shù)為:其中主函數(shù)為:void main(void)RMB r(23, 8, 6);int r1, r2, r3;r1= r ; /處理成處理成 r1 = r.operator int( );r2= int(r); /處理成處理成 r2 = r.operator int( ) ;r3= r.GetFen( ); coutr1=r1endl;coutr2=r2endl;coutr3=r3endl; 使用使用類(lèi)型自動(dòng)轉(zhuǎn)換類(lèi)型自動(dòng)轉(zhuǎn)換 較方便、自然。較方便、自然。第32頁(yè)/共57頁(yè)13.2.4 其他運(yùn)算符的重載其他運(yùn)算符的重載1重載重載
36、+、-運(yùn)算符運(yùn)算符 重載重載前置前置 + 運(yùn)算符的運(yùn)算符的成員成員函數(shù)的一般格式為:函數(shù)的一般格式為: :operator+ ( ) . 重載重載后置后置 + 運(yùn)算符的運(yùn)算符的成員成員函數(shù)的一般格式為:函數(shù)的一般格式為: :operator+ (int) . int 用于區(qū)分,沒(méi)有實(shí)際意義,用于區(qū)分,沒(méi)有實(shí)際意義,可給出實(shí)參,也可以不給出實(shí)參。可給出實(shí)參,也可以不給出實(shí)參。第33頁(yè)/共57頁(yè)重載重載前置前置 + 運(yùn)算符的運(yùn)算符的友元友元函數(shù)的一般格式為:函數(shù)的一般格式為:friend operator+ ( &obj ) . 重載重載后置后置+運(yùn)算符的運(yùn)算符的友元友元函數(shù)的一般格式為:函數(shù)的一
37、般格式為:friend operator+ ( &obj, int) . int 用于區(qū)分,沒(méi)有實(shí)際意義,用于區(qū)分,沒(méi)有實(shí)際意義,可給出實(shí)參,也可以不給出實(shí)參。可給出實(shí)參,也可以不給出實(shí)參。例例13.12 實(shí)現(xiàn)實(shí)現(xiàn)+和和 - 的前置和后置運(yùn)算符重載,的前置和后置運(yùn)算符重載, 程序見(jiàn)程序見(jiàn) “第第13章章 多態(tài)性多態(tài)性(例子例子).doc”第34頁(yè)/共57頁(yè)13.2.5 字符串類(lèi)字符串類(lèi)C+ 提供的字符串處理能力較弱,如不能用運(yùn)算符直提供的字符串處理能力較弱,如不能用運(yùn)算符直接對(duì)字符串對(duì)象進(jìn)行加、減等操作,接對(duì)字符串對(duì)象進(jìn)行加、減等操作,而必須通過(guò)字符串處理函數(shù)來(lái)實(shí)現(xiàn)拷貝、連接等操作而必須通過(guò)字
38、符串處理函數(shù)來(lái)實(shí)現(xiàn)拷貝、連接等操作。如:如:char s110=abc, s210=123; strcpy(s1, s2); /不能寫(xiě)成不能寫(xiě)成 s1= s2; strcat(s1, s2); /不能寫(xiě)成不能寫(xiě)成 s1= s1+s2;能否定義一個(gè)字符串類(lèi):能否定義一個(gè)字符串類(lèi):String 實(shí)現(xiàn):實(shí)現(xiàn): String s1(abc), s2(123), s3; s1 = s2; s3 = s1 + s2;能能! 可以利用可以利用C+提供的運(yùn)算符重載實(shí)現(xiàn)。提供的運(yùn)算符重載實(shí)現(xiàn)。第35頁(yè)/共57頁(yè)例例13.18 定義字符串類(lèi)定義字符串類(lèi)String,并測(cè)試重載的運(yùn)算,并測(cè)試重載的運(yùn)算符以及成員函數(shù)
39、符以及成員函數(shù) 程序見(jiàn)程序見(jiàn) “第第13章章 多態(tài)性多態(tài)性(例子例子).doc”,或閱讀教材,或閱讀教材上的程序。上的程序。重點(diǎn)講解:重點(diǎn)講解:(1) 說(shuō)明:函數(shù)名后的說(shuō)明:函數(shù)名后的 const(2) (拷貝拷貝)構(gòu)造函數(shù),在主函數(shù)中如何使用?構(gòu)造函數(shù),在主函數(shù)中如何使用?(3) 重載賦值重載賦值 = 運(yùn)算符運(yùn)算符(4) 重載重載 + 運(yùn)算符運(yùn)算符(5) 類(lèi)型轉(zhuǎn)換函數(shù)類(lèi)型轉(zhuǎn)換函數(shù) operator const char *(6) 刪除子串圖示見(jiàn)下頁(yè)刪除子串圖示見(jiàn)下頁(yè)第36頁(yè)/共57頁(yè)刪除子串:刪除子串:String operator - (const String &s1, const ch
40、ar *s2 ) lenp1p2s1.Strps2t.Strp第37頁(yè)/共57頁(yè)13.3 靜態(tài)聯(lián)編?kù)o態(tài)聯(lián)編聯(lián)編是指一個(gè)計(jì)算機(jī)程序彼此關(guān)聯(lián)的過(guò)程。聯(lián)編是指一個(gè)計(jì)算機(jī)程序彼此關(guān)聯(lián)的過(guò)程。 在本章中指在本章中指函數(shù)間調(diào)用關(guān)系的確定函數(shù)間調(diào)用關(guān)系的確定。按照聯(lián)編所確定的時(shí)刻不同,可分為兩種:按照聯(lián)編所確定的時(shí)刻不同,可分為兩種: 靜態(tài)聯(lián)編?kù)o態(tài)聯(lián)編和和動(dòng)態(tài)聯(lián)編動(dòng)態(tài)聯(lián)編。 靜態(tài)聯(lián)編是指聯(lián)編出現(xiàn)在編譯連接階段,靜態(tài)聯(lián)編是指聯(lián)編出現(xiàn)在編譯連接階段, 即函數(shù)調(diào)用關(guān)系的確定是在程序執(zhí)行之前。即函數(shù)調(diào)用關(guān)系的確定是在程序執(zhí)行之前。這種聯(lián)編又稱(chēng)早期聯(lián)編,這種聯(lián)編又稱(chēng)早期聯(lián)編, 通過(guò)這種聯(lián)編可實(shí)現(xiàn)靜態(tài)多態(tài)。通過(guò)這種聯(lián)編
41、可實(shí)現(xiàn)靜態(tài)多態(tài)。 第38頁(yè)/共57頁(yè)例例13.20 普通函數(shù)的靜態(tài)聯(lián)編普通函數(shù)的靜態(tài)聯(lián)編#include int add(int a, int b) /重載函數(shù)重載函數(shù)1 return(a+b); double add(double a, double b) /重載函數(shù)重載函數(shù)2 return(a+b); void main( ) coutadd(1, 2)t; /編譯時(shí)確定調(diào)用重載函數(shù)編譯時(shí)確定調(diào)用重載函數(shù)1 coutadd(1.1, 2.2)n; /編譯時(shí)確定調(diào)用重載函數(shù)編譯時(shí)確定調(diào)用重載函數(shù)2在編譯連接階段,就能根據(jù)參數(shù)的個(gè)數(shù)和類(lèi)型確定調(diào)用在編譯連接階段,就能根據(jù)參數(shù)的個(gè)數(shù)和類(lèi)型確定調(diào)用
42、的是哪一個(gè)函數(shù)。的是哪一個(gè)函數(shù)。 第39頁(yè)/共57頁(yè)例例13.21 讀書(shū)上程序讀書(shū)上程序 重點(diǎn)講解:重點(diǎn)講解:double CalcArea( Point &p ) return(p.Area( ); /A 編譯連接時(shí)確定調(diào)用函數(shù)編譯連接時(shí)確定調(diào)用函數(shù) 1void main( ) Rectangle r(0, 0, 1, 1); Circle c(0, 0, 1); coutCalcArea( r )t; coutCalcArea( c )n;Point Rectangle Circle能否找到一種機(jī)制,能否找到一種機(jī)制,讓讓CalcArea( )函數(shù)變成一個(gè)函數(shù)變成一個(gè)通用的求面積的函數(shù)。通
43、用的求面積的函數(shù)。這就是這就是C+提供的動(dòng)態(tài)聯(lián)編和提供的動(dòng)態(tài)聯(lián)編和虛函數(shù)應(yīng)完成的工作。虛函數(shù)應(yīng)完成的工作。 用派生類(lèi)實(shí)參初始化基類(lèi)型參,用派生類(lèi)實(shí)參初始化基類(lèi)型參,p只能引用基類(lèi)的成員。只能引用基類(lèi)的成員。第40頁(yè)/共57頁(yè)13.4 動(dòng)態(tài)聯(lián)編和虛函數(shù)動(dòng)態(tài)聯(lián)編和虛函數(shù)運(yùn)行階段才能確定函數(shù)的調(diào)用關(guān)系,這就是動(dòng)態(tài)聯(lián)編運(yùn)行階段才能確定函數(shù)的調(diào)用關(guān)系,這就是動(dòng)態(tài)聯(lián)編 動(dòng)態(tài)聯(lián)編又稱(chēng)滯后聯(lián)編、晚期聯(lián)編,動(dòng)態(tài)聯(lián)編又稱(chēng)滯后聯(lián)編、晚期聯(lián)編, 動(dòng)態(tài)聯(lián)編技術(shù)能實(shí)現(xiàn)動(dòng)態(tài)多態(tài)。動(dòng)態(tài)聯(lián)編技術(shù)能實(shí)現(xiàn)動(dòng)態(tài)多態(tài)。 必須將類(lèi)的成員函數(shù)定義成虛函數(shù),必須將類(lèi)的成員函數(shù)定義成虛函數(shù), 才可以實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。才可以實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。 將成員函
44、數(shù)定義成虛函數(shù)的格式為:將成員函數(shù)定義成虛函數(shù)的格式為:virtual ( ) 13.4.1 虛函數(shù)虛函數(shù)第41頁(yè)/共57頁(yè)重點(diǎn)講解:重點(diǎn)講解:double CalcArea(Point &p) return( p.Area( ) ); /A Area( )是虛函數(shù)是虛函數(shù)void main( ) Point p(1, 2); Rectangle r(0, 0, 1, 1); Circle c(0, 0, 1); coutCalcArea( p )t CalcArea( r )t CalcArea( c )n;例例13.22 閱讀書(shū)上程序閱讀書(shū)上程序Area( )是虛函數(shù)是虛函數(shù) ,C+ 規(guī)定
45、,規(guī)定,在在 A 行保留相關(guān)的行保留相關(guān)的三個(gè)虛函數(shù)入口地址三個(gè)虛函數(shù)入口地址 。在程序的運(yùn)行階段,在程序的運(yùn)行階段,根據(jù)實(shí)參的類(lèi)型來(lái)確定根據(jù)實(shí)參的類(lèi)型來(lái)確定調(diào)用哪一個(gè)虛函數(shù)。調(diào)用哪一個(gè)虛函數(shù)。通用的通用的求求面積函數(shù)面積函數(shù)第42頁(yè)/共57頁(yè)(1)派生類(lèi)的虛函數(shù)必須與基類(lèi)虛函數(shù)同名,)派生類(lèi)的虛函數(shù)必須與基類(lèi)虛函數(shù)同名, 且參數(shù)的類(lèi)型、個(gè)數(shù)、順序必須一致,且參數(shù)的類(lèi)型、個(gè)數(shù)、順序必須一致, 否則,屬于函數(shù)重載,而不是虛函數(shù)。否則,屬于函數(shù)重載,而不是虛函數(shù)。有關(guān)虛函數(shù)的說(shuō)明:有關(guān)虛函數(shù)的說(shuō)明: (2)基類(lèi)中虛函數(shù)前的關(guān)鍵字)基類(lèi)中虛函數(shù)前的關(guān)鍵字virtual不能缺省。不能缺省。 (3)必須
46、通過(guò)基類(lèi)對(duì)象的)必須通過(guò)基類(lèi)對(duì)象的指針或引用指針或引用調(diào)用虛函數(shù),調(diào)用虛函數(shù), 才能實(shí)現(xiàn)動(dòng)態(tài)多態(tài)。才能實(shí)現(xiàn)動(dòng)態(tài)多態(tài)。 (4)虛函數(shù)必須是類(lèi)的成員函數(shù),不能是友元函數(shù),)虛函數(shù)必須是類(lèi)的成員函數(shù),不能是友元函數(shù), 也不能是靜態(tài)成員函數(shù)。也不能是靜態(tài)成員函數(shù)。 (5)不能將構(gòu)造函數(shù)定義為虛函數(shù),)不能將構(gòu)造函數(shù)定義為虛函數(shù), 但可將析構(gòu)函數(shù)定義為虛函數(shù)。但可將析構(gòu)函數(shù)定義為虛函數(shù)。 (6)調(diào)用虛函數(shù)速度較慢。因?yàn)?,要?shí)現(xiàn)動(dòng)態(tài)多態(tài),)調(diào)用虛函數(shù)速度較慢。因?yàn)椋獙?shí)現(xiàn)動(dòng)態(tài)多態(tài), 在函數(shù)調(diào)用處必須保留多個(gè)虛函數(shù)的入口地址。在函數(shù)調(diào)用處必須保留多個(gè)虛函數(shù)的入口地址。第43頁(yè)/共57頁(yè)例例13.23 在成員
47、函數(shù)中調(diào)用在成員函數(shù)中調(diào)用虛函數(shù)虛函數(shù)程序見(jiàn)程序見(jiàn) “第第13章章 多態(tài)性多態(tài)性(例子例子).doc”,或閱讀教材上的程序?;蜷喿x教材上的程序。我們注意,我們注意,在成員函數(shù)中調(diào)用成員函數(shù)時(shí),在成員函數(shù)中調(diào)用成員函數(shù)時(shí),系統(tǒng)都是通過(guò)對(duì)象自身的指針系統(tǒng)都是通過(guò)對(duì)象自身的指針this調(diào)用的,調(diào)用的,A類(lèi)中的類(lèi)中的fun2( )的實(shí)際被處理成如下形式:的實(shí)際被處理成如下形式:void fun2( ) cout A:fun2 fun3( ); /EB b;b.fun1( ); / 調(diào)用調(diào)用A類(lèi)的類(lèi)的fun1( )和和fun2( ),在,在A類(lèi)的類(lèi)的fun2( )函數(shù)中,函數(shù)中, / 在在E行行, th
48、is 是指向是指向b的指針的指針, 所以調(diào)用所以調(diào)用B的的fun3( )函數(shù)函數(shù)第44頁(yè)/共57頁(yè)class Apublic: A( ) fun( ); virtual void fun( ) cout A:fun t; ;class B: public A public: B( ) fun( ); void fun( ) cout B:fun t; void g( ) fun( ); / 在成員函數(shù)中調(diào)用在成員函數(shù)中調(diào)用虛函數(shù)虛函數(shù); A B C 例例13.24 在構(gòu)造函數(shù)中調(diào)用在構(gòu)造函數(shù)中調(diào)用虛函數(shù)虛函數(shù)第45頁(yè)/共57頁(yè)class C: public B public:C( ) fun(
49、 ); void fun( ) cout C:fun n; ;void main( ) C c; /依次調(diào)用依次調(diào)用A、B、C三類(lèi)的缺省構(gòu)造函數(shù)三類(lèi)的缺省構(gòu)造函數(shù) c.g( );運(yùn)行結(jié)果:運(yùn)行結(jié)果:A:fun B:fun C:funC:fun構(gòu)造函數(shù)調(diào)用虛函數(shù),調(diào)用的是類(lèi)本身的虛函數(shù)。構(gòu)造函數(shù)調(diào)用虛函數(shù),調(diào)用的是類(lèi)本身的虛函數(shù)。成員函數(shù)調(diào)用成員函數(shù)調(diào)用虛函數(shù)虛函數(shù),遵循動(dòng)態(tài)多態(tài)性原則。,遵循動(dòng)態(tài)多態(tài)性原則。ABC第46頁(yè)/共57頁(yè)13.4.2 虛析構(gòu)函數(shù)虛析構(gòu)函數(shù)如果類(lèi)的構(gòu)造函數(shù)中有如果類(lèi)的構(gòu)造函數(shù)中有動(dòng)態(tài)申請(qǐng)動(dòng)態(tài)申請(qǐng)的存儲(chǔ)空間,的存儲(chǔ)空間,在析構(gòu)函數(shù)中在析構(gòu)函數(shù)中應(yīng)釋放該空間應(yīng)釋放該空間。此
50、時(shí),建議將析構(gòu)函數(shù)定義為虛函數(shù),此時(shí),建議將析構(gòu)函數(shù)定義為虛函數(shù),以便實(shí)現(xiàn)以便實(shí)現(xiàn)通過(guò)基類(lèi)的指針或引用通過(guò)基類(lèi)的指針或引用撤消派生類(lèi)對(duì)象撤消派生類(lèi)對(duì)象時(shí)的多態(tài)性。時(shí)的多態(tài)性。 第47頁(yè)/共57頁(yè)#include class Achar *Aptr;public:A( ) Aptr = new char100; A( ) /析構(gòu)函數(shù)不是虛函數(shù)析構(gòu)函數(shù)不是虛函數(shù) delete Aptr; coutDelete Aptrendl; ;例例: 析構(gòu)函數(shù)不是虛函數(shù)的情況析構(gòu)函數(shù)不是虛函數(shù)的情況第48頁(yè)/共57頁(yè)class B : public A char *Bptr; public: B( ) Bptr=new char100; B( ) delete Bptr; coutDelete Bptrendl; ;void main(void)B b; 輸出結(jié)果:輸出結(jié)果:Delete BptrDelete Aptr系統(tǒng)自動(dòng)撤銷(xiāo)派生類(lèi)對(duì)象,系統(tǒng)自動(dòng)撤銷(xiāo)派生類(lèi)對(duì)象,不需要將析構(gòu)函數(shù)定義為虛函數(shù)不需要將析構(gòu)函數(shù)定義為虛函數(shù)。第49頁(yè)/共57頁(yè)void main(void)A *p=new B; delete p;A &p1=*(new B); delete &p1;輸出結(jié)果:輸出結(jié)果:Delete Apt
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度消防安全評(píng)估與咨詢(xún)服務(wù)合同3篇
- 2025年度高端裝備制造與出口總合同3篇
- 二零二五年度礦山地質(zhì)災(zāi)害防治合同匯編3篇
- 2024版大學(xué)學(xué)生宿舍樓物業(yè)承包合同
- 二零二五年飯店客房經(jīng)營(yíng)權(quán)及客房用品定制合同3篇
- 2024環(huán)保技術(shù)研發(fā)合同成果轉(zhuǎn)化
- 2024物流公司與倉(cāng)儲(chǔ)企業(yè)之間的貨物運(yùn)輸合同
- 2024行政訴訟刑事上訴狀案件調(diào)解與和解合同2篇
- 2024年精簡(jiǎn)版勞動(dòng)協(xié)議樣本模板版B版
- 二零二五版山林林木種植與管護(hù)合同范本3篇
- 第2課《濟(jì)南的冬天》課件-2024-2025學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)上冊(cè)
- 2024年水利工程高級(jí)工程師理論考試題庫(kù)(濃縮400題)
- 增強(qiáng)現(xiàn)實(shí)技術(shù)在藝術(shù)教育中的應(yīng)用
- TD/T 1060-2021 自然資源分等定級(jí)通則(正式版)
- 《創(chuàng)傷失血性休克中國(guó)急診專(zhuān)家共識(shí)(2023)》解讀
- 倉(cāng)庫(kù)智能化建設(shè)方案
- 海外市場(chǎng)開(kāi)拓計(jì)劃
- 供應(yīng)鏈組織架構(gòu)與職能設(shè)置
- 幼兒數(shù)學(xué)益智圖形連線(xiàn)題100題(含完整答案)
- 七上-動(dòng)點(diǎn)、動(dòng)角問(wèn)題12道好題-解析
- 2024年九省聯(lián)考新高考 數(shù)學(xué)試卷(含答案解析)
評(píng)論
0/150
提交評(píng)論