版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章多態(tài)性與虛函數(shù)本章的學(xué)習(xí)目的
客觀世界中的事物多種多樣、千姿百態(tài),各類事物都有其特殊性,這就是客觀世界的多態(tài)性。為了正確反映客觀世界的多態(tài)性,面向?qū)ο蠹夹g(shù)中也提供了多態(tài)性機(jī)制,使多態(tài)性成為了面向?qū)ο蟪绦蛟O(shè)計的重要特征。所謂多態(tài)性就是在類層次結(jié)構(gòu)的相同類或不同類中,可用相同的函數(shù)名實現(xiàn)功能不同的操作。多態(tài)性的應(yīng)用使編程更為簡捷、便利,它為程序的模塊化設(shè)計提供了又一支持手段。
因此,在學(xué)過面向?qū)ο蟮姆庋b性和繼承性編程機(jī)制之后,我們還應(yīng)該了解和掌握多態(tài)性編程機(jī)制,以提高我們的面向?qū)ο缶幊棠芰Α1菊碌膶W(xué)習(xí)內(nèi)容多態(tài)性的概念靜態(tài)聯(lián)編和動態(tài)聯(lián)編的概念虛函數(shù)的概念抽象類的概念
5.1多態(tài)性的概念
多態(tài)性是指在類層次結(jié)構(gòu)的相同類或不同類中,可用相同的函數(shù)名實現(xiàn)功能不同的操作,從而可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù),實現(xiàn)不同情況下的不同操作。如下圖所示。C++支持的多態(tài)可以分為兩種類型:編譯時多態(tài):在同一個類或不同類中可用相同的函數(shù)名和不同的參數(shù)表來實現(xiàn)不同的功能操作,編譯系統(tǒng)在編譯階段就可以根據(jù)調(diào)用函數(shù)的參數(shù)表來確定調(diào)用哪個同名函數(shù)。classpointer{intx,y;public:
pointer(intcx,intcy){x=cx;y=cy;}
pointer(constpointer&p){x=p.x;y=p.y;}……;};voidmain(){pointerob1(40,50);pointerob2=ob1;……}運(yùn)行時多態(tài):在類的繼承層次結(jié)構(gòu)中,不同層次的類中可能具有同名但實現(xiàn)不同的函數(shù),需要在運(yùn)行階段才能根據(jù)對象所屬的層次來確定調(diào)用哪個類中的同名函數(shù)。5.2聯(lián)編多態(tài)性的實現(xiàn)過程中,把一個消息函數(shù)(如student1.display())與一個對象的具體函數(shù)體相聯(lián)系的過程叫做聯(lián)編(binding)。按照聯(lián)編時所處階段的不同,可以把聯(lián)編分為靜態(tài)聯(lián)編和動態(tài)聯(lián)編,這兩種聯(lián)編過程分別對應(yīng)著多態(tài)性的兩種實現(xiàn)方式。5.2.1靜態(tài)聯(lián)編
在編譯階段由編譯系統(tǒng)根據(jù)調(diào)用函數(shù)的操作參數(shù)來確定調(diào)用哪個同名函數(shù),并將函數(shù)調(diào)用與該函數(shù)體連接起來.voidmain(){Students1,*ps;GStudents2;s1.print();s2.print();s2.Student::print();ps=&s1;ps->print();ps=&s2;ps->print();}
Astudent
Agraduatestudent
Astudent
Astudent
Astudent5.2.2動態(tài)聯(lián)編只有在運(yùn)行程序時才能根據(jù)函數(shù)調(diào)用指令來確定將要調(diào)用的函數(shù),這種在運(yùn)行階段進(jìn)行的聯(lián)編稱為動態(tài)聯(lián)編。例如,下例中用指針調(diào)用同名函數(shù)。動態(tài)聯(lián)編的優(yōu)點(diǎn)是提供了更好的編程靈活性、問題的抽象性和程序的易維護(hù)性,缺點(diǎn)是與靜態(tài)聯(lián)編相比,函數(shù)調(diào)用速度慢。(如p->print();
)問題的抽象性:在實際應(yīng)用中,編程人員不必過多地考慮類的層次關(guān)系,無須顯式地寫出虛函數(shù)的路徑,只需將對象指針指向相應(yīng)的派生類對象或引用相應(yīng)的對象,通過動態(tài)聯(lián)編就可以對消息做出正確的反應(yīng)。(如p->print();
)5.3.2虛函數(shù)的使用如果某類中的一個成員函數(shù)被說明為虛函數(shù),這就意味著該成員函數(shù)在派生類中可能有不同的函數(shù)實現(xiàn)。當(dāng)使用對象指針或?qū)ο笠谜{(diào)用虛函數(shù)時,就可實現(xiàn)動態(tài)聯(lián)編,即在運(yùn)行時進(jìn)行關(guān)聯(lián)或綁定。定義一個基類的對象指針就可以指向不同派生類的對象,來調(diào)用不同派生類的虛函數(shù);(2)只有通過對象指針或?qū)ο笠脕碚{(diào)用虛函數(shù),才能實現(xiàn)動態(tài)聯(lián)編。如果采用對象來調(diào)用虛函數(shù),則采用的仍然是靜態(tài)聯(lián)編方式。例5-2靜態(tài)聯(lián)編和動態(tài)聯(lián)編
#include<iostream.h>classStudent{public:
virtual
voidprint(){cout<<“Astudent”<<endl;}
};classGStudent:publicStudent{public:
virtualvoidprint(){cout<<“Agraduatestudent”<<endl;}};voidmain(){Students1,*ps;GStudents2;s1.print();s2.print();s2.Student::print();
ps=&s1;
ps->print();
ps=&s2;
ps->print();}Astudent
Agraduatestudent
Astudent
Astudent
Agraduatestudent(2)一般來說,可將類族中的具有共性的成員函數(shù)聲明為虛函數(shù),而具有個性的函數(shù)沒有必要聲明為虛函數(shù)。如果在派生類中沒有重新定義虛函數(shù),則派生類的對象將使用基類的虛函數(shù)代碼。靜態(tài)成員函數(shù)不能聲明為虛函數(shù)。內(nèi)聯(lián)成員函數(shù)不能聲明為虛函數(shù)。因為對于內(nèi)聯(lián)成員函數(shù),在程序編譯時,編譯系統(tǒng)就應(yīng)明確用哪個函數(shù)體替換內(nèi)聯(lián)函數(shù)調(diào)用的地方,而不能等到運(yùn)行時再確定調(diào)用哪個函數(shù)。構(gòu)造函數(shù)不能是虛函數(shù)。因為構(gòu)造函數(shù)是在對象產(chǎn)生之前運(yùn)行的,而虛函數(shù)是使用已有對象或其指針來調(diào)用的函數(shù)。所以,將構(gòu)造函數(shù)聲明為虛函數(shù)是沒有意義的。析構(gòu)函數(shù)可以是虛函數(shù),且往往被定義成虛函數(shù)。因為實施多態(tài)時是通過將基類的指針指向派生類的對象來完成的,如果要刪除該指針?biāo)傅呐缮悓ο髸r就應(yīng)該調(diào)用該指針?biāo)赶虻呐缮惖奈鰳?gòu)函數(shù),然后派生類的析構(gòu)函數(shù)又調(diào)用基類的析構(gòu)函數(shù),這樣整個派生類的對象才能被完全釋放。5.4抽象類有時在聲明一個基類時無法為虛函數(shù)定義其具體實現(xiàn),這時可以將其聲明為一個純虛函數(shù)。包含純虛函數(shù)的類稱為抽象類。例如:classShapes
{protected:
int
x,y;public:voidsetvalue(int
d,intw=0){x=d;y=w;}
virtual
voiddisp()=0;};
5.4.1純虛函數(shù)的定義在C++中,一個僅為多態(tài)機(jī)制提供一個接口而沒有任何實體定義的函數(shù),被稱為純虛函數(shù)。聲明純虛函數(shù)的一般格式如下:抽象類只能用作其他類的基類,不能用來建立抽象類對象。抽象類不能用作參數(shù)類型、函數(shù)返回值類型或顯式轉(zhuǎn)換的類型,但可以說明或定義抽象類的指針或引用,該指針或引用可以指向抽象類的派生類對象,進(jìn)而實現(xiàn)多態(tài)性。virtual<返回值類型><函數(shù)名>(<參數(shù)表>)=0;
例5-3抽象類的定義和應(yīng)用classShapes
{protected:intx,y;public:voidsetvalue(intd,intw=0){x=d;y=w;}
virtualvoiddisp()=0;};classSquare:publicShapes{public:voiddisp(){cout<<“areaofrectangle:”<<x*y<<endl;}};voidmain(){Shapes*ptr;SquareS1;ptr=&S1;ptr->setvalue(10,5);ptr->disp();}程序的運(yùn)行結(jié)果為:areaofrectangular:50
習(xí)題和實驗題
項目設(shè)計1----用面向?qū)ο蠓椒▽崿F(xiàn)校園信息管理系統(tǒng)1系統(tǒng)分析和設(shè)計校園信息管理系統(tǒng)的主要功能就是對在校人員(包括學(xué)生和教師)的信息資料進(jìn)行管理。
另外,為了便于對教師和學(xué)生信息進(jìn)行統(tǒng)一處理以提高效率,還可以將學(xué)校的所有人員抽象為一個Person類,將student和teacher類作為其派生類。因此,可畫出系統(tǒng)的對象模型如下:person類定義數(shù)據(jù)類型描述namechar數(shù)組學(xué)生姓名sexchar數(shù)組學(xué)生性別addresschar數(shù)組學(xué)生家庭地址birthdayDate(自定義結(jié)構(gòu))出生日期typeptype
(自定義枚舉類型)student或teachershow虛成員函數(shù)輸出對象信息read虛成員函數(shù)讀入對象信息save虛成員函數(shù)將對
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 海外知識產(chǎn)權(quán)培訓(xùn)
- 碾泥工崗前規(guī)章考核試卷含答案
- 礦山設(shè)備運(yùn)行協(xié)調(diào)員道德評優(yōu)考核試卷含答案
- 海員基本安全培訓(xùn)
- 丁腈橡膠裝置操作工崗前創(chuàng)新思維考核試卷含答案
- 客運(yùn)船舶駕駛員崗前實操知識技能考核試卷含答案
- 高空作業(yè)機(jī)械裝配調(diào)試工測試驗證考核試卷含答案
- 酒店員工培訓(xùn)資料管理與更新制度
- 酒店客房裝修改造制度
- 酒店服務(wù)質(zhì)量監(jiān)控評估制度
- 2026年及未來5年市場數(shù)據(jù)中國工程擔(dān)保行業(yè)發(fā)展運(yùn)行現(xiàn)狀及投資潛力預(yù)測報告
- (2026年春新版本)人教版二年級數(shù)學(xué)下冊全冊教案
- DB15-T 4265-2026 零碳產(chǎn)業(yè)園配套新能源規(guī)劃編制規(guī)范
- GB/T 13871.1-2022密封元件為彈性體材料的旋轉(zhuǎn)軸唇形密封圈第1部分:尺寸和公差
- 醫(yī)院消毒滅菌效果環(huán)境衛(wèi)生學(xué)監(jiān)測報告單(檢驗)
- 從事拍賣業(yè)務(wù)許可(變更審批)告知承諾書
- xxx項目勘察設(shè)計任務(wù)書
- 中國礦業(yè)權(quán)評估準(zhǔn)則
- 防盜門購銷合同通用版
- 【精品文檔】館藏文物信息管理系統(tǒng)用戶手冊電子版 - 館藏文物信息管理系統(tǒng)用戶手冊
- 臨床生物化學(xué)檢驗技術(shù):第17章 消化系統(tǒng)疾病的生物化學(xué)檢驗
評論
0/150
提交評論