版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第5章章多態(tài)性多態(tài)性 內(nèi)容提要內(nèi)容提要內(nèi)容提要(續(xù))內(nèi)容提要(續(xù)) 內(nèi)容提要(續(xù))內(nèi)容提要(續(xù))1 多態(tài)性的概念多態(tài)性的概念n多態(tài)性是面向?qū)ο笙到y(tǒng)的多態(tài)性是面向?qū)ο笙到y(tǒng)的重要特征重要特征之一之一n多態(tài)性多態(tài)性指發(fā)出指發(fā)出同樣的消息同樣的消息被不同類型被不同類型的對(duì)象接收時(shí)有的對(duì)象接收時(shí)有不同的行為不同的行為的現(xiàn)象的現(xiàn)象n多態(tài)提高了軟件的多態(tài)提高了軟件的可重用性可重用性和和可擴(kuò)充性可擴(kuò)充性1 多態(tài)性的概念(續(xù))多態(tài)性的概念(續(xù))nC+中,多態(tài)表現(xiàn)為中,多態(tài)表現(xiàn)為一個(gè)名字定義不同的一個(gè)名字定義不同的函數(shù)函數(shù),這些函數(shù)執(zhí)行不同但相似的操作,這些函數(shù)執(zhí)行不同但相似的操作,即用同樣的接口訪問功能不同的
2、函數(shù),從即用同樣的接口訪問功能不同的函數(shù),從而可以實(shí)現(xiàn)而可以實(shí)現(xiàn)“一個(gè)接口,多種方法一個(gè)接口,多種方法”nC+多態(tài)的實(shí)現(xiàn):多態(tài)的實(shí)現(xiàn):n函數(shù)重載函數(shù)重載n運(yùn)算符重載運(yùn)算符重載n虛函數(shù)虛函數(shù)2 多態(tài)性的實(shí)現(xiàn)原理多態(tài)性的實(shí)現(xiàn)原理n多態(tài)性實(shí)現(xiàn)多態(tài)性實(shí)現(xiàn)和和編譯連接編譯連接、執(zhí)行執(zhí)行密切相關(guān)密切相關(guān)nC+源程序中函數(shù)的經(jīng)過源程序中函數(shù)的經(jīng)過編譯編譯后形成不后形成不同的目標(biāo)代碼塊(同的目標(biāo)代碼塊(OBJ等),這些代碼等),這些代碼和庫(kù)要進(jìn)行和庫(kù)要進(jìn)行連接連接形成最終代碼(形成最終代碼(EXE等)等)n目標(biāo)代碼中目標(biāo)代碼中函數(shù)調(diào)用處含有連接信息函數(shù)調(diào)用處含有連接信息n連接信息含有被調(diào)用連接信息含有被調(diào)用函
3、數(shù)的地址函數(shù)的地址,若地,若地址固定就成為址固定就成為靜態(tài)地址值靜態(tài)地址值;若地址不固;若地址不固定就是定就是指針變量(函數(shù)指針)指針變量(函數(shù)指針)2 多態(tài)性的實(shí)現(xiàn)原理(續(xù))多態(tài)性的實(shí)現(xiàn)原理(續(xù))n圖例說明多態(tài)的實(shí)現(xiàn)圖例說明多態(tài)的實(shí)現(xiàn) main int n; short age;/ Add(實(shí)參實(shí)參);/return 0; ; 代碼后半部分代碼后半部分Add函數(shù)調(diào)用函數(shù)調(diào)用代碼前半部分代碼前半部分main函數(shù)函數(shù)代碼在代碼在中中Add代碼代碼3Add代碼代碼2Add代碼代碼1連接信息所在連接信息所在2 多態(tài)性的實(shí)現(xiàn)原理(續(xù))多態(tài)性的實(shí)現(xiàn)原理(續(xù))n編譯后連接信息中函數(shù)地址值固定不變,編譯后連
4、接信息中函數(shù)地址值固定不變,在此基礎(chǔ)上實(shí)現(xiàn)的多態(tài)稱為在此基礎(chǔ)上實(shí)現(xiàn)的多態(tài)稱為靜態(tài)多態(tài)靜態(tài)多態(tài)nC+中,靜態(tài)多態(tài)表現(xiàn)為中,靜態(tài)多態(tài)表現(xiàn)為函數(shù)重載函數(shù)重載和運(yùn)算和運(yùn)算符重載(特殊的函數(shù)重載)符重載(特殊的函數(shù)重載)n編譯后連接信息中函數(shù)地址值用指針指向,編譯后連接信息中函數(shù)地址值用指針指向,在此基礎(chǔ)上實(shí)現(xiàn)的多態(tài)稱為在此基礎(chǔ)上實(shí)現(xiàn)的多態(tài)稱為動(dòng)態(tài)多態(tài)動(dòng)態(tài)多態(tài)nC+中,動(dòng)態(tài)多態(tài)是通過中,動(dòng)態(tài)多態(tài)是通過虛函數(shù)虛函數(shù)實(shí)現(xiàn)的實(shí)現(xiàn)的3 靜態(tài)綁定與動(dòng)態(tài)綁定靜態(tài)綁定與動(dòng)態(tài)綁定n綁定綁定n程序中的操作(函數(shù))調(diào)用與執(zhí)行該操作程序中的操作(函數(shù))調(diào)用與執(zhí)行該操作的代碼關(guān)聯(lián)過程稱為的代碼關(guān)聯(lián)過程稱為綁定綁定。n靜態(tài)綁定(
5、靜態(tài)綁定(編譯時(shí)編譯時(shí))n綁定過程出現(xiàn)在編譯階段,用對(duì)象名或者綁定過程出現(xiàn)在編譯階段,用對(duì)象名或者類名來限定要調(diào)用的函數(shù)。類名來限定要調(diào)用的函數(shù)。n動(dòng)態(tài)綁定(動(dòng)態(tài)綁定(運(yùn)行時(shí)運(yùn)行時(shí))n綁定過程在程序運(yùn)行時(shí)執(zhí)行,在程序運(yùn)行綁定過程在程序運(yùn)行時(shí)執(zhí)行,在程序運(yùn)行時(shí)才確定將要調(diào)用的函數(shù)(指針指向)。時(shí)才確定將要調(diào)用的函數(shù)(指針指向)。1 普通函數(shù)重載普通函數(shù)重載代碼后半部分代碼后半部分Add(5)函數(shù)調(diào)用函數(shù)調(diào)用 (函數(shù)的地址)(函數(shù)的地址)代碼前半部分代碼前半部分調(diào)用調(diào)用Add的函數(shù)的函數(shù)代碼代碼Add(char)Add(int)Add(short)2 類的成員函數(shù)重載類的成員函數(shù)重載n成員函數(shù)的重
6、載有兩種情況:成員函數(shù)的重載有兩種情況: 1)一種是)一種是參數(shù)有所差別參數(shù)有所差別的重載,這和普的重載,這和普通函數(shù)的重載規(guī)則一樣通函數(shù)的重載規(guī)則一樣 2)另一種是函數(shù)所帶的)另一種是函數(shù)所帶的參數(shù)完全相同參數(shù)完全相同,但要求他們屬于不同的類(或名字空間),但要求他們屬于不同的類(或名字空間),特別是在類的繼承關(guān)系中特別是在類的繼承關(guān)系中n成員函數(shù)因?yàn)楹蓄惖某蓡T函數(shù)因?yàn)楹蓄惖膖his指針參數(shù),所指針參數(shù),所以自然就可以相互區(qū)分開以自然就可以相互區(qū)分開2 類的成員函數(shù)重載(續(xù))類的成員函數(shù)重載(續(xù))n繼承中函數(shù)重載示例繼承中函數(shù)重載示例class pointint x,y;public:
7、point(int a,int b) x=a; y=b; float area() return 0.0; ; class circle:public pointint r;public: circle(int a,int b,int c) :point(a, b) r=c; float area() return 3.14*r*r; ;3 名字修飾名字修飾nC+編譯器對(duì)函數(shù)進(jìn)行編譯時(shí),使用編譯器對(duì)函數(shù)進(jìn)行編譯時(shí),使用名名字修飾字修飾技術(shù),對(duì)函數(shù)處理后技術(shù),對(duì)函數(shù)處理后形成內(nèi)部名形成內(nèi)部名n名字修飾技術(shù)把函數(shù)名和參數(shù)類型綜合起名字修飾技術(shù)把函數(shù)名和參數(shù)類型綜合起來,形成內(nèi)部名稱(目標(biāo)代碼中)來
8、,形成內(nèi)部名稱(目標(biāo)代碼中)n比如(相似的理解):比如(相似的理解): int Add(int); Add_INT void Add(int, char); Add_INT_CHAR1 運(yùn)算符重載運(yùn)算符重載n實(shí)質(zhì):一種實(shí)質(zhì):一種特殊的函數(shù)重載特殊的函數(shù)重載n作用:擴(kuò)展了作用:擴(kuò)展了C+的類型機(jī)制的類型機(jī)制n分為一般運(yùn)算符重載和類成員運(yùn)算符重載分為一般運(yùn)算符重載和類成員運(yùn)算符重載n一般格式:一般格式:返回類型返回類型 operator 運(yùn)算符名運(yùn)算符名(參數(shù)表)(參數(shù)表) / 其中其中operator是關(guān)鍵詞,是關(guān)鍵詞,“operator運(yùn)算符運(yùn)算符”相當(dāng)于函數(shù)名相當(dāng)于函數(shù)名1 運(yùn)算符重載(續(xù))
9、運(yùn)算符重載(續(xù))n運(yùn)算符重載是對(duì)已有運(yùn)算符賦予多重含義運(yùn)算符重載是對(duì)已有運(yùn)算符賦予多重含義n必要性必要性n預(yù)定義運(yùn)算符其運(yùn)算對(duì)象只能是基本數(shù)據(jù)預(yù)定義運(yùn)算符其運(yùn)算對(duì)象只能是基本數(shù)據(jù)類型,而不適用于用戶自定義類型(如類)類型,而不適用于用戶自定義類型(如類)n實(shí)現(xiàn)機(jī)制實(shí)現(xiàn)機(jī)制n運(yùn)算表達(dá)式將轉(zhuǎn)化為對(duì)運(yùn)算符函數(shù)的調(diào)用,運(yùn)算表達(dá)式將轉(zhuǎn)化為對(duì)運(yùn)算符函數(shù)的調(diào)用,運(yùn)算對(duì)象轉(zhuǎn)化為運(yùn)算符函數(shù)的實(shí)參運(yùn)算對(duì)象轉(zhuǎn)化為運(yùn)算符函數(shù)的實(shí)參n編譯系統(tǒng)對(duì)重載運(yùn)算符的選擇,遵循函數(shù)編譯系統(tǒng)對(duì)重載運(yùn)算符的選擇,遵循函數(shù)重載的選擇原則(重載的選擇原則(參數(shù)類型匹配參數(shù)類型匹配)1 運(yùn)算符重載(續(xù))運(yùn)算符重載(續(xù))n可以重載的運(yùn)算符可以
10、重載的運(yùn)算符單目:?jiǎn)文浚?- + ! + - 等等雙目:雙目: + - * / % 等等其他:其他: - () = += new delete等等n不可以重載的運(yùn)算符:不可以重載的運(yùn)算符: . * : ?: sizeof(5個(gè))個(gè))2 一般運(yùn)算符重載示例一般運(yùn)算符重載示例2 一般運(yùn)算符重載示例(續(xù))一般運(yùn)算符重載示例(續(xù))3 成員運(yùn)算符重載成員運(yùn)算符重載n運(yùn)算符運(yùn)算符重載目的重載目的是為了滿足新類型(類)是為了滿足新類型(類)的運(yùn)算需要的運(yùn)算需要n根據(jù)根據(jù)封裝和隱藏原理封裝和隱藏原理的要求,類中的數(shù)據(jù)的要求,類中的數(shù)據(jù)成員一般為私有,所以大部分的成員一般為私有,所以大部分的一般運(yùn)算一般運(yùn)算符符
11、都重載為都重載為友元運(yùn)算符友元運(yùn)算符n另外一種重載方法是把運(yùn)算符放在類中,另外一種重載方法是把運(yùn)算符放在類中,成為成為成員運(yùn)算符成員運(yùn)算符3 成員運(yùn)算符重載(續(xù))成員運(yùn)算符重載(續(xù))n示例示例3 成員運(yùn)算符重載(續(xù))成員運(yùn)算符重載(續(xù))4 調(diào)用方式調(diào)用方式n調(diào)用方式調(diào)用方式可以象可以象C運(yùn)算符的使用:運(yùn)算符的使用:也可以象函數(shù)那樣使用:也可以象函數(shù)那樣使用:5 運(yùn)算符重載使用說明運(yùn)算符重載使用說明n只能對(duì)已有運(yùn)算符重載,只能對(duì)已有運(yùn)算符重載,不能造新算符不能造新算符,并且重載的運(yùn)算符與原有并且重載的運(yùn)算符與原有功能相似功能相似n不能改變不能改變運(yùn)算符目數(shù)、優(yōu)先級(jí)和結(jié)合性運(yùn)算符目數(shù)、優(yōu)先級(jí)和結(jié)合
12、性n成員運(yùn)算符成員運(yùn)算符重載重載比一般運(yùn)算符比一般運(yùn)算符(友元)重(友元)重載的載的參數(shù)數(shù)目少一個(gè)參數(shù)數(shù)目少一個(gè)n有一種情況必須使用友元運(yùn)算符重載,如:有一種情況必須使用友元運(yùn)算符重載,如: complex t=complex(2,3)+c1;1 定義的語(yǔ)法形式定義的語(yǔ)法形式n一般格式:一般格式: class X/ friend返回類型返回類型 operator 運(yùn)算符運(yùn)算符(參數(shù)表)(參數(shù)表) /;返回類型返回類型 operator 運(yùn)算符運(yùn)算符(參數(shù)表)(參數(shù)表) 函數(shù)體函數(shù)體2 雙目運(yùn)算符重載雙目運(yùn)算符重載n兩個(gè)復(fù)數(shù)兩個(gè)復(fù)數(shù)a+bi和和c+di進(jìn)行加、減、乘、除進(jìn)行加、減、乘、除的方法如
13、下:的方法如下:n加法加法: (a+bi) +(c+di)=(a+c) + (b+d)in減法減法: (a+bi) - (c+di)=(a-c) + (b-d)in乘法乘法: (a+bi) * (c+di)=(ac+bd)+(ad+bc)in除法除法: (a+bi)/(c+di)=(a+bi)*(c-di)/(c2-d2)復(fù)數(shù)類的運(yùn)算符重載復(fù)數(shù)類的運(yùn)算符重載#include class complex private: double real; double imag; public: complex(double r = 0.0, double i = 0.0); void print();
14、 friend complex operator+(complex a, complex b); friend complex operator-(complex a, complex b); friend complex operator*(complex a, complex b); friend complex operator/(complex a, complex b);說明:說明:n如果類如果類X中采用友員函數(shù)重載雙目運(yùn)算符中采用友員函數(shù)重載雙目運(yùn)算符,而,而aa和和bb是類是類X的兩個(gè)對(duì)象,則以下兩種函數(shù)調(diào)用的兩個(gè)對(duì)象,則以下兩種函數(shù)調(diào)用方法是等價(jià)的:方法是等價(jià)的: aa bb;
15、 /隱式調(diào)用隱式調(diào)用 operator (aa, bb); /顯示調(diào)用顯示調(diào)用n函數(shù)返回說明函數(shù)返回說明: complex operator+(complex a, complex b) return complex(a.real+b.real, a.imag+b.imag); 執(zhí)行效率要高執(zhí)行效率要高3 單目運(yùn)算符重載單目運(yùn)算符重載n用友員函數(shù)重載單目運(yùn)算符時(shí),需要一個(gè)用友員函數(shù)重載單目運(yùn)算符時(shí),需要一個(gè)顯式的操作數(shù)。顯式的操作數(shù)。 例例5.4n需要注意的是:使用友員函數(shù)重載需要注意的是:使用友員函數(shù)重載“+”、“-”這樣的運(yùn)算符,可能會(huì)出現(xiàn)一些問題。這樣的運(yùn)算符,可能會(huì)出現(xiàn)一些問題。 例例
16、5.5 臨時(shí)對(duì)象不能實(shí)現(xiàn)。臨時(shí)對(duì)象不能實(shí)現(xiàn)。 例例5.6 采用引用參數(shù)傳遞可實(shí)現(xiàn)。采用引用參數(shù)傳遞可實(shí)現(xiàn)。1 定義的語(yǔ)法形式定義的語(yǔ)法形式n一般格式:一般格式: class X/ 返回類型返回類型 operator 運(yùn)算符運(yùn)算符(參數(shù)表)(參數(shù)表) /;返回類型返回類型 X:operator 運(yùn)算符運(yùn)算符(參數(shù)表)(參數(shù)表) 函數(shù)體函數(shù)體 單目運(yùn)算符,參數(shù)表為空;雙目為一個(gè)操作數(shù)。單目運(yùn)算符,參數(shù)表為空;雙目為一個(gè)操作數(shù)。2 雙目運(yùn)算符重載雙目運(yùn)算符重載#include 具體實(shí)現(xiàn)見例具體實(shí)現(xiàn)見例5.7class complex private: double real; double imag
17、; public: complex(double r = 0.0, double i = 0.0); void print(); friend complex operator + (complex c); friend complex operator - (complex c); friend complex operator * (complex c); friend complex operator / (complex c);3 單目運(yùn)算符重載單目運(yùn)算符重載n對(duì)單目運(yùn)算符而言,成員運(yùn)算符函數(shù)的參對(duì)單目運(yùn)算符而言,成員運(yùn)算符函數(shù)的參數(shù)表中沒有參數(shù),此時(shí)當(dāng)前對(duì)象作為運(yùn)算數(shù)表中沒有參數(shù),此
18、時(shí)當(dāng)前對(duì)象作為運(yùn)算符的一個(gè)操作數(shù)。符的一個(gè)操作數(shù)。n詳見詳見P179 例例5.8n由于所有的成員函數(shù)都有一個(gè)由于所有的成員函數(shù)都有一個(gè)this指針,因指針,因此任何對(duì)對(duì)象私有數(shù)據(jù)的修改都將影響實(shí)此任何對(duì)對(duì)象私有數(shù)據(jù)的修改都將影響實(shí)際調(diào)用運(yùn)算符函數(shù)的對(duì)象。際調(diào)用運(yùn)算符函數(shù)的對(duì)象。比較比較n參數(shù)個(gè)數(shù)不同參數(shù)個(gè)數(shù)不同n雙目運(yùn)算符一般重載為友員或成員運(yùn)算符雙目運(yùn)算符一般重載為友員或成員運(yùn)算符函數(shù),但有一種情況,必須使用友員函數(shù)函數(shù),但有一種情況,必須使用友員函數(shù)n在在5.4的類的類AB中,用成員重載中,用成員重載“+”運(yùn)算符:運(yùn)算符:AB:operator + (int x) AB temp; tem
19、p.a = a + x; Temp.b = b + x; AB ob; ob = ob +100; ob = 100 +ob; 原因原因n為定義為定義運(yùn)算運(yùn)算 整數(shù)整數(shù)+AB類類n采用友元函數(shù)可實(shí)現(xiàn)采用友元函數(shù)可實(shí)現(xiàn)(例例5.9):#include class AB int a, b; public: AB(int x=0, int y=0); friend AB operator + (AB ob, int x); friend AB operator + (int x, AB ob); void show(); 前綴與后綴的語(yǔ)法前綴與后綴的語(yǔ)法n對(duì)于前綴方式對(duì)于前綴方式+ob,可以用運(yùn)算符
20、函數(shù),可以用運(yùn)算符函數(shù)重載為:重載為:ob.operator+(); / 成員成員operator+(X&ob); / 友元友元 n對(duì)于后綴方式對(duì)于后綴方式ob + ,可以用運(yùn)算符函數(shù),可以用運(yùn)算符函數(shù)重載為:重載為:ob.operator+(int); / 成員成員operator+(X&ob, int); / 友元友元n調(diào)用時(shí),參數(shù)調(diào)用時(shí),參數(shù)int一般被傳值一般被傳值 例例5.10定義的語(yǔ)法形式定義的語(yǔ)法形式n對(duì)任一類對(duì)任一類X,如果沒有用戶自定義的賦值,如果沒有用戶自定義的賦值運(yùn)算符函數(shù),那么系統(tǒng)將自動(dòng)地為其生成運(yùn)算符函數(shù),那么系統(tǒng)將自動(dòng)地為其生成一個(gè)默認(rèn)的賦值運(yùn)算符函
21、數(shù)一個(gè)默認(rèn)的賦值運(yùn)算符函數(shù) X&X:operator=(const X &source) /成員間賦值成員間賦值 n通常默認(rèn)的賦值運(yùn)算符函數(shù)是能夠勝任工通常默認(rèn)的賦值運(yùn)算符函數(shù)是能夠勝任工作的作的必須自行重載的情況必須自行重載的情況n指針懸掛問題指針懸掛問題n例例5.11n重載賦值運(yùn)算符解決指針懸掛問題重載賦值運(yùn)算符解決指針懸掛問題n例例5.12n說明:說明: 只能重載為成員函數(shù),不能重載為友元函數(shù)只能重載為成員函數(shù),不能重載為友元函數(shù) 類的賦值運(yùn)算符可以被重載,但不能被繼承類的賦值運(yùn)算符可以被重載,但不能被繼承定義的語(yǔ)法形式定義的語(yǔ)法形式n在在C+中,在重載下標(biāo)運(yùn)算符中,在重
22、載下標(biāo)運(yùn)算符時(shí),認(rèn)為時(shí),認(rèn)為它是一個(gè)雙目運(yùn)算符,例如它是一個(gè)雙目運(yùn)算符,例如XYn對(duì)于下標(biāo)運(yùn)算符重載定義只能使用成員函對(duì)于下標(biāo)運(yùn)算符重載定義只能使用成員函數(shù),其形式如下:數(shù),其形式如下: 返回類型返回類型 類名類名:operator(形參形參) /函數(shù)體函數(shù)體 n例例5.14定義的語(yǔ)法形式定義的語(yǔ)法形式n在在C+中,在重載函數(shù)調(diào)用運(yùn)算符中,在重載函數(shù)調(diào)用運(yùn)算符()時(shí),時(shí),認(rèn)為它是一個(gè)雙目運(yùn)算符,例如認(rèn)為它是一個(gè)雙目運(yùn)算符,例如X(Y)n對(duì)于函數(shù)調(diào)用運(yùn)算符重載定義只能使用成對(duì)于函數(shù)調(diào)用運(yùn)算符重載定義只能使用成員函數(shù),其形式如下:?jiǎn)T函數(shù),其形式如下: 返回類型返回類型 類名類名: operator
23、 (形參表形參表) /函數(shù)體函數(shù)體 n例例5.16系統(tǒng)預(yù)定義類型間的轉(zhuǎn)換系統(tǒng)預(yù)定義類型間的轉(zhuǎn)換n隱式類型轉(zhuǎn)換隱式類型轉(zhuǎn)換 遵循以下規(guī)則:遵循以下規(guī)則: A=B B轉(zhuǎn)換為類型轉(zhuǎn)換為類型A后賦值后賦值 char short 轉(zhuǎn)換為轉(zhuǎn)換為 int 類型不一致時(shí),低的轉(zhuǎn)換為高的類型不一致時(shí),低的轉(zhuǎn)換為高的n顯式類型轉(zhuǎn)換顯式類型轉(zhuǎn)換 強(qiáng)制轉(zhuǎn)換法:強(qiáng)制轉(zhuǎn)換法:(類型名類型名)表達(dá)式表達(dá)式 函數(shù)法:函數(shù)法: 類型名類型名(表達(dá)式表達(dá)式)類類型與系統(tǒng)預(yù)定義類型間的轉(zhuǎn)換類類型與系統(tǒng)預(yù)定義類型間的轉(zhuǎn)換n通過構(gòu)造函數(shù)進(jìn)行類型轉(zhuǎn)換通過構(gòu)造函數(shù)進(jìn)行類型轉(zhuǎn)換 例例5-17n通過類類型轉(zhuǎn)換函數(shù)進(jìn)行類型轉(zhuǎn)換通過類類型轉(zhuǎn)換函數(shù)
24、進(jìn)行類型轉(zhuǎn)換 class 源類類名源類類名 / operator 目的類型目的類型() / return 目的類型的數(shù)據(jù);目的類型的數(shù)據(jù); /;類類型轉(zhuǎn)換函數(shù)注意:類類型轉(zhuǎn)換函數(shù)注意:n只能定義為一個(gè)類的成員函數(shù)只能定義為一個(gè)類的成員函數(shù)n類類型轉(zhuǎn)換函數(shù)既沒有參數(shù),類類型轉(zhuǎn)換函數(shù)既沒有參數(shù),也不顯式給出返回類型也不顯式給出返回類型n一個(gè)類可以定義多個(gè)類類型轉(zhuǎn)一個(gè)類可以定義多個(gè)類類型轉(zhuǎn)換函數(shù)換函數(shù) 隱式轉(zhuǎn)換的例子隱式轉(zhuǎn)換的例子5.191 虛函數(shù)的概念虛函數(shù)的概念n概念:虛函數(shù)是被概念:虛函數(shù)是被virtual關(guān)鍵字修飾的成關(guān)鍵字修飾的成員函數(shù)員函數(shù)n格式:格式:virtual 函數(shù)類型函數(shù)類型
25、函數(shù)名函數(shù)名(參數(shù)表參數(shù)表);n虛函數(shù)是重載的另一種表現(xiàn)形式(虛函數(shù)是重載的另一種表現(xiàn)形式(動(dòng)態(tài)重動(dòng)態(tài)重載載更靈活的多態(tài)機(jī)制)更靈活的多態(tài)機(jī)制)n實(shí)現(xiàn)機(jī)制實(shí)現(xiàn)機(jī)制:通過:通過函數(shù)指針函數(shù)指針,在運(yùn)行時(shí)建立在運(yùn)行時(shí)建立函數(shù)調(diào)用和函數(shù)體間的聯(lián)系函數(shù)調(diào)用和函數(shù)體間的聯(lián)系,然后再執(zhí)行,然后再執(zhí)行相應(yīng)的動(dòng)作(編譯器特殊處理)相應(yīng)的動(dòng)作(編譯器特殊處理)1 虛函數(shù)的概念(續(xù))虛函數(shù)的概念(續(xù))代碼后半部分代碼后半部分Add(5)函數(shù)調(diào)用函數(shù)調(diào)用(函數(shù)地址指針)(函數(shù)地址指針)代碼前半部分代碼前半部分調(diào)用調(diào)用Add的函數(shù)的函數(shù)代碼代碼Add(int)Add(int)Add(int) 函數(shù)的調(diào)用通過指針來完成
26、,可以在運(yùn)函數(shù)的調(diào)用通過指針來完成,可以在運(yùn)行時(shí)根據(jù)需要改變其執(zhí)行的代碼!行時(shí)根據(jù)需要改變其執(zhí)行的代碼!2 虛函數(shù)的定義和使用虛函數(shù)的定義和使用n定義定義:在類中用:在類中用virtual關(guān)鍵字修飾,可以關(guān)鍵字修飾,可以在派生類中重新定義(多態(tài))在派生類中重新定義(多態(tài))n注意注意:在派生類中重新定義(重載)時(shí),:在派生類中重新定義(重載)時(shí),其函數(shù)原型,包括返回類型、函數(shù)名、參其函數(shù)原型,包括返回類型、函數(shù)名、參數(shù)個(gè)數(shù)與參數(shù)類型及其順序,都必須與基數(shù)個(gè)數(shù)與參數(shù)類型及其順序,都必須與基類中的原型相同。類中的原型相同。n原因原因:虛函數(shù)用函數(shù)指針實(shí)現(xiàn):虛函數(shù)用函數(shù)指針實(shí)現(xiàn)2 虛函數(shù)的定義和使用(
27、續(xù))虛函數(shù)的定義和使用(續(xù))/ 虛函數(shù)示例虛函數(shù)示例比較抽象的類比較抽象的類Shapeclass Shapeprotected:int type;public:Shape(int t=0) type =t; virtual int Type() return type; / 虛函數(shù)虛函數(shù)virtual void Draw() coutShape Drawendl; ;2 虛函數(shù)的定義和使用(續(xù))虛函數(shù)的定義和使用(續(xù))n使用:像正常函數(shù)一樣使用使用:像正常函數(shù)一樣使用void main()Shape sp;coutsp.Type();sp.Draw();2 虛函數(shù)的定義和使用(續(xù))虛函數(shù)的定義
28、和使用(續(xù))n帶有虛函數(shù)類對(duì)象的內(nèi)存結(jié)構(gòu)帶有虛函數(shù)類對(duì)象的內(nèi)存結(jié)構(gòu) 比如:比如:Shape sp;pvtabletypeTypeDrawType函數(shù)函數(shù)的代碼的代碼Draw函數(shù)函數(shù)的代碼的代碼 其中,其中,pvtable是虛函數(shù)表指是虛函數(shù)表指針,如果該類沒有虛函數(shù),則針,如果該類沒有虛函數(shù),則其對(duì)象沒有其對(duì)象沒有pvtablesp虛函數(shù)表虛函數(shù)表虛函數(shù)代碼虛函數(shù)代碼3 繼承中的虛函數(shù)繼承中的虛函數(shù)n虛函數(shù)在繼承中發(fā)揮著虛函數(shù)在繼承中發(fā)揮著強(qiáng)大的作用強(qiáng)大的作用n虛函數(shù)能被派生類繼承,也虛函數(shù)能被派生類繼承,也可以被派生類可以被派生類重載重載,重載后的虛函數(shù)有自己的代碼,重載后的虛函數(shù)有自己的代
29、碼n派生類中虛函數(shù)的派生類中虛函數(shù)的virtual可以省略,建議可以省略,建議保留,增強(qiáng)程序可讀性保留,增強(qiáng)程序可讀性n繼承中的虛函數(shù)更能發(fā)揮繼承中的虛函數(shù)更能發(fā)揮動(dòng)態(tài)多態(tài)性的優(yōu)動(dòng)態(tài)多態(tài)性的優(yōu)勢(shì)勢(shì)(借助于指針實(shí)現(xiàn))(借助于指針實(shí)現(xiàn))3 繼承中的虛函數(shù)(續(xù))繼承中的虛函數(shù)(續(xù))n繼承中,繼承中,基類的指針可以指向其任何派生基類的指針可以指向其任何派生類對(duì)象類對(duì)象n虛函數(shù)能被派生類繼承,也虛函數(shù)能被派生類繼承,也可以被派生類可以被派生類重載重載,重載后的虛函數(shù)有自己的代碼,重載后的虛函數(shù)有自己的代碼n以上面兩點(diǎn)為基礎(chǔ),可以衍生出非常靈活以上面兩點(diǎn)為基礎(chǔ),可以衍生出非常靈活的程序編寫方式(的程序編寫
30、方式(COM組件技術(shù)基礎(chǔ)組件技術(shù)基礎(chǔ))n從下面的從下面的C+代碼可見一斑代碼可見一斑3 繼承中的虛函數(shù)(續(xù))繼承中的虛函數(shù)(續(xù))/ 比較抽象的類比較抽象的類Shapeclass Shapeprotected:int type;public:Shape(int t=-1) type =t; int Type() return type; / 定義了兩個(gè)虛函數(shù)定義了兩個(gè)虛函數(shù)virtual void Draw() cout“Shape Drawn”; virtual double Area() return 0.0; ;3 繼承中的虛函數(shù)(續(xù))繼承中的虛函數(shù)(續(xù))/ 點(diǎn)類點(diǎn)類Pointclass
31、Point : public Shapeprotected:int x,y;public:Point(int a=0,int b=0) : Shape(0) x=a; y=b; virtual void Draw() / 虛函數(shù)虛函數(shù) cout“Point Drawendl; ;3 繼承中的虛函數(shù)(續(xù))繼承中的虛函數(shù)(續(xù))/ 圓類圓類Circleclass Circle : public Point private:int r;public:Circle(int a,int b,int c) : Point(a,b) type=2; r=c; virtual void Draw() / 虛函數(shù)
32、虛函數(shù) cout“Circle DrawDraw();coutArea()endl; void main() Shape s; Point p; Cirlce c(3,4,2); AutoMachine(&s);AutoMachine(&p);AutoMachine(&c);3 繼承中的虛函數(shù)(續(xù))繼承中的虛函數(shù)(續(xù))n上述例子的圖結(jié)構(gòu)上述例子的圖結(jié)構(gòu)DrawAreaDrawAreapvtabletypepvtabletypexyrpvtabletypexyDrawAreaDraw代碼代碼Area代碼代碼Draw代碼代碼Draw代碼代碼Area代碼代碼代碼區(qū)代碼區(qū)Shape對(duì)象對(duì)象Point對(duì)象對(duì)象Circle對(duì)象對(duì)象3 繼承中的虛函數(shù)(續(xù))繼承中的虛函數(shù)(續(xù))n上述代碼中,自動(dòng)機(jī)上述代碼中,自動(dòng)機(jī)AutoMachine有個(gè)基有個(gè)基類指針,它可指向其任何一個(gè)派生類對(duì)象類指針,它可指向其任何一個(gè)派生類對(duì)象DrawAreaDrawAreapvtabletypepvt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024雙方同意離婚協(xié)議之法律咨詢服務(wù)合同
- 2024年度能源設(shè)施安防監(jiān)控工程項(xiàng)目合同
- 2024醫(yī)療器械銷售代理合同
- 2024年大連智能鎖產(chǎn)品測(cè)試與質(zhì)量控制合同
- 2024年度學(xué)校教學(xué)樓照明改造合同
- 2024年衛(wèi)星導(dǎo)航與位置服務(wù)系統(tǒng)合作協(xié)議
- 2024年多功能砂漿添加劑采購(gòu)合同
- 2024年全球貿(mào)易合作伙伴協(xié)議
- 2024年口腔門診部員工合同模板
- 痤瘡護(hù)理課件教學(xué)課件
- 企業(yè)如何利用新媒體做好宣傳工作課件
- 如何培養(yǎng)孩子的自信心課件
- 中醫(yī)藥膳學(xué)全套課件
- 頸脊髓損傷-匯總課件
- 齒輪故障診斷完美課課件
- 2023年中國(guó)鹽業(yè)集團(tuán)有限公司校園招聘筆試題庫(kù)及答案解析
- 大班社會(huì)《特殊的車輛》課件
- 野生動(dòng)物保護(hù)知識(shí)講座課件
- 早教托育園招商加盟商業(yè)計(jì)劃書
- 光色變奏-色彩基礎(chǔ)知識(shí)與應(yīng)用課件-高中美術(shù)人美版(2019)選修繪畫
- 前列腺癌的放化療護(hù)理
評(píng)論
0/150
提交評(píng)論