




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
多態(tài)性與虛函數(shù)
1普通組員函數(shù)重載
2派生類指針
3虛函數(shù)
4純虛函數(shù)與抽象類
多態(tài)性是面向對象程序設計主要特征之一。所謂多態(tài)性是指當不一樣對象收到相同消息時,產生不一樣動作。C++多態(tài)性詳細表達在運行和編譯兩個方面,在程序運行時多態(tài)性經過繼承和虛函數(shù)來表達,而在程序編譯時多態(tài)性表達在函數(shù)和運算符重載上。
1普通組員函數(shù)重載 在C++語言中,只有在申明函數(shù)原型時形式參數(shù)個數(shù)或者對應位置類型不一樣,兩個或更多函數(shù)就能夠共用一個名字。這種在同一作用域中允許多個函數(shù)使用同一函數(shù)名辦法被稱為重載(overloading)。函數(shù)重載是C++程序取得多態(tài)性路徑之一。1.1函數(shù)重載方法 函數(shù)重載要求編譯器能夠唯一地確定調用一個函數(shù)時應執(zhí)行哪個函數(shù)代碼,既采取哪個函數(shù)實現(xiàn)。確定函數(shù)實現(xiàn)時,要求從函數(shù)參數(shù)個數(shù)和類型上來區(qū)分。這就是說,進行函數(shù)重載時,要求同名函數(shù)在參數(shù)個數(shù)上不一樣,或者參數(shù)類型不一樣。不然,將無法實現(xiàn)函數(shù)重載。
#include<iostream.h>intsquare(intx){returnx*x;}doublesquare(doubley){returny*y;}main(){cout<<”Thesquareofinteger7is”<<square(7)<<endl;cout<<”Thesquareofdouble7.5is”<<square(7.5)<<endl;return0;}例1:給出以下程序運行結果。此程序運行結果為:Thesquareofinteger7is49Thesquareofinteger7.5is56.25
#include<iostream.h>constdoublePI=3.1415;doublelength(floatr){return2*PI*r;}doublelength(floatx,floaty){return2*(x+y);}例2:用重載函數(shù)實現(xiàn)求圓和矩形周長。voidmain(){floata,b,r;cout<<”輸入圓半徑:”;cin>>r;cout<<”圓周長:”<<length(r)<<endl;cout<<”輸入矩形長和寬:”;cin>>a>>b;cout<<”矩形周長:”<<length(r)<<endl;}1.2函數(shù)重載表示形式 普通組員函數(shù)重載可表示為兩種形式: 1.在一個類說明中重載 比如: Show(int,char); Show(char*,float); 2.基類組員函數(shù)在派生類重載。有3種編譯區(qū)分方法 (1)依據(jù)參數(shù)特征加以區(qū)分 比如: Show(int,char)與
Show(char*,float)不是同一函數(shù),編譯能夠區(qū)分 (2)使用“
::
”加以區(qū)分 比如: A::Show() 有別于 B::Show() (3)依據(jù)類對象加以區(qū)分 比如: Aobj.Show()調用 A::Show()
Bobj.Show()調用 B::Show()1.3函數(shù)重載注意事項 在C++語言中,編譯程序選擇對應重載函數(shù)版本時函數(shù)返回值類型是不起作用。不能僅靠函數(shù)返回值來區(qū)分重載函數(shù),必須從形式參數(shù)上區(qū)分開來。比如: voidprint(inta); voidprint(inta,intb); intprint(floata[]); 這三個函數(shù)是重載函數(shù),因為C++編譯程序能夠從形式參數(shù)上將它們區(qū)分開來。 但: intf(inta); doublef(inta); 這兩個函數(shù)就不是重載函數(shù),編譯程序認為這是對一個函數(shù)重復說明,因為兩個函數(shù)形式參數(shù)個數(shù)與對應位置類型完全相同。 由typedef定義類型別名并沒有真正創(chuàng)建一個新類型,所以以下程序段: typedefdoublemoney; doublecalculate(doubleincome); moneycalculate(moneyincome); 也是錯誤函數(shù)重載。 一樣道理,不一樣參數(shù)傳遞方式也無法區(qū)分重載函數(shù),如: voidfunc(intvalue); voidfunc(int&value); 也不能作為重載函數(shù)。 在程序中不可濫用函數(shù)重載,不適當重載會降低程序可讀性。C++語言并沒有提供任何約束限制重載函數(shù)之間必須相關聯(lián),程序員可能用相同名字定義兩個互不相關函數(shù)。實際上函數(shù)重載暗示了一個關聯(lián),不應該重載那些本質上有區(qū)分函數(shù),只有當函數(shù)實現(xiàn)語義非常相近時才應使用函數(shù)重載。
1.4函數(shù)重載二義性 函數(shù)重載二義性(ambiguity)是指C++語言編譯程序無法在多個重載函數(shù)中選擇正確函數(shù)進行調用。函數(shù)重載二義性主要源于C++語言隱式類型轉換與默認參數(shù)。 在函數(shù)調用時,編譯程序將按以下規(guī)則選擇重載函數(shù):假如函數(shù)調用實際參數(shù)類型與一個重載函數(shù)形式參數(shù)類型完全匹配,則選擇調用該重載函數(shù);假如找不到與實際參數(shù)類型完全匹配函數(shù)原型,但假如將一個類型轉換為更高級類型后能找到完全匹配函數(shù)原型,編譯程序將選擇調用該重載函數(shù)。所謂更高級類型是指能處理值域較大,如int轉換為unsignedint,unsignedint轉換為long,long轉換為unsignedfloat等。 比如:intfunc(doubled); … count<<func(‘A’); 雖未申明函數(shù)原型intfunc(char),但函數(shù)調用func(‘A’)并不會產生任何問題,因為編譯程序自動將字符‘A’轉換為double類型,然后調用函數(shù)intfunc(double)。 隱式類型轉換是由C++編譯程序自動完成,這種類型轉換是引發(fā)函數(shù)重載二義性主要原因。在重載函數(shù)中使用默認參數(shù)也可能造成二義性。 C++還提供了一個更為靈活多態(tài)性機制:虛函數(shù)。虛函數(shù)允許函數(shù)調用與函數(shù)體聯(lián)絡在運行時才進行。當普通類型對應于不一樣類型變種時,這個能力顯得尤其主要。2派生類指針 指向基類和派生類指針是相關。 比如: A*p; //指向類型A對象指針 AA_obj; //類型A對象 BB_obj; //類型B對象 p=&A_obj; //p指向類型A對象 p=&B_obj; //p指向類型B對象, //它是A派生類 利用p,能夠經過B_obj訪問全部從A_obj繼承元素,但不能用p訪問B_obj本身特定元素(除非用了顯式類型轉換)。
例6
注意:能夠用一個指向基類指針指向其公有派生類對象。但卻不能用指向派生類指針指向一個基類對象。希望用基類指針訪問其公有派生類特定組員,必須將基類指針用顯式類型轉換為派生類指針。比如((B_class*)p)->show_phone();一個指向基類指針可用來指向從基類公有派生任何對象,這一事實非常主要,它是C++實現(xiàn)運行時多態(tài)關鍵路徑。
3虛函數(shù)3.1虛函數(shù)概念 虛函數(shù)是在基類中冠以關鍵字virtual組員函數(shù)。它提供了一個接口界面。虛函數(shù)能夠在一個或多個派生類中被重定義。 例13-7:當main()函數(shù)語句1~6伴隨指針p所指對象不一樣而調用不一樣版本who()函數(shù)時,就實現(xiàn)了運行時多態(tài),這種機制實現(xiàn)依賴于在在基類中把組員函數(shù)who()說明為虛函數(shù)。
在C++語言中,是經過將一個函數(shù)定義成虛函數(shù)來實現(xiàn)運行時多態(tài)。假如一個函數(shù)被定義為虛函數(shù),那么,即使是使用指向基類對象指針來調用該組員函數(shù),C++也能確保所調用是正確特定于實際對象組員函數(shù)。 假如類c1,c2…由基類base派生而來,base有一個用virtual修飾公有或保護函數(shù)組員f(),而在c1,c2…中一些類中重新定義了組員函數(shù)f(),而對f()調用都是經過級基類對象或指針進行,在程序執(zhí)行時才決定是調用c1還是c2或其它派生類中定義f(),這么函數(shù)f()稱為虛函數(shù)。 一旦一個函數(shù)在基類中第一次申明時使用了virtual了關鍵字,那么,當派生類重載該組員函數(shù)時,不論時否使用了virtual關鍵字,該組員函數(shù)都將被看作一個虛函數(shù),也就是說,虛函數(shù)重載函數(shù)仍是虛函數(shù)。 注意:在派生類重定義虛函數(shù)時必須有相同函數(shù)原型,包含返回類型,函數(shù)名、參數(shù)個數(shù)、參數(shù)類型次序必須相同。虛函數(shù)必須是類組員函數(shù)。不能為全局函數(shù),也不能為靜態(tài)函數(shù)。不能將友員說明為虛函數(shù),但虛函數(shù)能夠是另一個類友員。析構函數(shù)能夠是虛函數(shù),但結構函數(shù)不能為虛函數(shù)。3.2使用虛函數(shù)時應注意: (1)在類體系中訪問一個虛函數(shù)時,應使用指向基類類型指針或對基類類型引用,以滿足運行時多態(tài)性要求。當然也能夠像調用普通組員函數(shù)那樣利用對象名來調用一個函數(shù)。 (2)在派生類中重新定義虛函數(shù)時,必須確保該函數(shù)值和參數(shù)與基類中說明完全一致,不然就屬于重載(參數(shù)不一樣)或是一個錯誤(返回值不一樣)。 (3)若在派生類中沒有重新定義虛函數(shù),則該類對象將使用其基類中虛函數(shù)代碼。 (4)虛函數(shù)必須是類一個組員函數(shù),不能是友元,但它能夠是另一個類友元。另外,虛函數(shù)不得是一個靜態(tài)組員。
(5)析構函數(shù)能夠是virtual虛函數(shù),但結構函數(shù)則不得是虛函數(shù)。普通地將,若某類中定義有虛函數(shù),則其析構函數(shù)也應該說明為虛函數(shù)。尤其是在析構函數(shù)需要完成一些有意義操作——比如釋放內存時,尤其應該如此。 (6)一個類虛函數(shù)僅對派生類中重定義函數(shù)起作用,對其它函數(shù)沒有影響。在基類中使用虛函數(shù)確保了經過指向基類對象指針調用基類一個虛函數(shù)時,C++系統(tǒng)對該調用進行動態(tài)綁定,而使用普通函數(shù)則是靜態(tài)綁定。3.3虛函數(shù)與重載函數(shù)比較 (1)重載函數(shù)要求函數(shù)有相同返回值類型和函數(shù)名稱,并有不一樣參數(shù)序列;而虛函數(shù)則要求這三項(函數(shù)名、返回值類型和參數(shù)序列)完全相同; (2)重載函數(shù)能夠是組員函數(shù)或友員函數(shù),而虛函數(shù)只能是組員函數(shù); (3)重載函數(shù)調用是以所傳遞參數(shù)序列差異作為調用不一樣函數(shù)依據(jù);虛函數(shù)是依據(jù)對象不一樣去調用不一樣類虛函數(shù); (4)虛函數(shù)在運行時表現(xiàn)出多態(tài)功效,這是C++精華;而重載函數(shù)則在編譯時表現(xiàn)出多態(tài)性。4純虛函數(shù)與抽象類4.1純虛函數(shù) 在許多情況下,在基類中不能給出有意義虛函數(shù)定義,這時能夠把它說明成純虛函數(shù),把它定義留給派生類來做。定義純虛函數(shù)普通形式為:class類名{
virtual返回值類型函數(shù)名(參數(shù)表)=0;
}; 純虛函數(shù)是一個在基類中說明虛函數(shù),它在基類中沒有定義,要求任何派生類都定義自己版本。純虛函數(shù)為各派生類提供一個公共界面。因為純虛函數(shù)所在類中沒有它定義,在該類結構函數(shù)和析構函數(shù)中不允許調用純虛函數(shù),不然會造成程序運行錯誤。但其它組員函數(shù)能夠調用純虛函。 下面代碼在類Creature中將虛函數(shù)KindOf申明為純虛函數(shù):classCreature{
public:
virtualchar*KindOf()=0;};char*Creature::KindOf(){
return"Creature";} 使用下面格式也是能夠:classCreature{
public:
virtualchar*KindOf()=0
{
return"Creature";
}};4.2抽象類 假如一個類中最少有一個純虛函數(shù),那么這個類被成為抽象類(abstractclass)。抽象類中不但包含純虛函數(shù),也可包含虛函數(shù)。抽象類中純虛函數(shù)可能是在抽象類中定義,也可能是從它抽象基類中繼承下來且重定義。 抽象類有一個主要特點,即抽象類必須用作派生其它類基類,而不能用于直接創(chuàng)建對象實例。抽象類不能直接創(chuàng)建對象原因是其中有一個或多個函數(shù)沒有定義,但仍可使用指向抽象類指針支持運行時多態(tài)性。 一個抽象類不能夠用來創(chuàng)建對象,這只能用來為派生類提供了一個接口規(guī)范,派生類中必須重載基類中純虛函數(shù),不然它仍將被看作一個抽象類。假如要直接調用抽象類中定義純虛函數(shù),必須使用完全限定名,如上面示例,要想直接調用抽象類Creature中定義純虛函數(shù),應該使用下面格式: cout
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 怎樣將設計成果轉化為商業(yè)價值
- 2025西南大學輔導員考試試題及答案
- 健康促進與健康教育課件
- 生理衛(wèi)生保健知識講座
- T/ZGZS 0303-2023再生工業(yè)鹽硫酸鈉
- 幼兒園指甲衛(wèi)生
- 咖啡店畢業(yè)設計
- 校園社團管理系統(tǒng)前端設計
- 創(chuàng)傷現(xiàn)場急救課件
- 健康傳播材料課件
- 2025年度幼兒園教師編制考試全真模擬試題及答案(共五套)
- 新媒體業(yè)務面試題及答案
- 廣東省廣州市2025年中考地理模擬測試卷(含答案)
- 食堂應急預案管理制度
- 中級財務會計-中級財務會計復習學習資料
- 基于《山海經》神祇形象的青少年解壓文具設計研究
- 安全生產法律法規(guī)基本知識
- 2025年新高考歷史預測模擬試卷黑吉遼蒙卷(含答案解析)
- 2025高考語文名校作文題立意與例文參考11篇
- 2025年高三語言復習【文字運用題】專項練習卷附答案解析
- 申報企業(yè)高級工程師職稱述職報告
評論
0/150
提交評論