版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
面向?qū)ο蟮谖逭碌谝豁摚捕唔摚?022年,8月28日本章的學(xué)習(xí)內(nèi)容多態(tài)性的概念靜態(tài)聯(lián)編和動態(tài)聯(lián)編的概念虛函數(shù)的概念抽象類的概念
第二頁,共二十七頁,2022年,8月28日
5.1多態(tài)性的概念
多態(tài)性是指在類層次結(jié)構(gòu)的相同類或不同類中,可用相同的函數(shù)名實現(xiàn)功能不同的操作,從而可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù),實現(xiàn)不同情況下的不同操作。如下圖所示。第三頁,共二十七頁,2022年,8月28日C++的多態(tài)性可使同一條消息,被不同類型的對象接收時將產(chǎn)生不同的行為。多態(tài)性是實現(xiàn)“一種接口,多種方法”的技術(shù)。這里的“一種接口”是指相同函數(shù)名和參數(shù)表,而“多種方法”是指多種函數(shù)實現(xiàn),實現(xiàn)相似但不完全相同的功能。第四頁,共二十七頁,2022年,8月28日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;……}第五頁,共二十七頁,2022年,8月28日運行時多態(tài):在類的繼承層次結(jié)構(gòu)中,不同層次的類中可能具有同名但實現(xiàn)不同的函數(shù),需要在運行階段才能根據(jù)對象所屬的層次來確定調(diào)用哪個類中的同名函數(shù)。第六頁,共二十七頁,2022年,8月28日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ù)體連接起來.第七頁,共二十七頁,2022年,8月28日例5-1靜態(tài)聯(lián)編
#include<iostream.h>classStudent{public:voidprint(){cout<<“Astudent”<<endl;}voidprint(inta){cout<<a<<endl;}};classGStudent:publicStudent{public:voidprint(){cout<<“Agraduatestudent”<<endl;}};第八頁,共二十七頁,2022年,8月28日voidmain(){Students1,*ps;GStudents2;s1.print();s2.print();s2.Student::print();ps=&s1;ps->print();ps=&s2;ps->print();}
Astudent
Agraduatestudent
Astudent
Astudent
Astudent第九頁,共二十七頁,2022年,8月28日5.2.2動態(tài)聯(lián)編只有在運行程序時才能根據(jù)函數(shù)調(diào)用指令來確定將要調(diào)用的函數(shù),這種在運行階段進行的聯(lián)編稱為動態(tài)聯(lián)編。例如,下例中用指針調(diào)用同名函數(shù)。第十頁,共二十七頁,2022年,8月28日動態(tài)聯(lián)編的優(yōu)點是提供了更好的編程靈活性、問題的抽象性和程序的易維護性,缺點是與靜態(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();
)第十一頁,共二十七頁,2022年,8月28日5.3虛函數(shù)
虛函數(shù)是動態(tài)聯(lián)編的基礎(chǔ)。基類的虛函數(shù)經(jīng)過派生之后,在類族中可以實現(xiàn)運行時的多態(tài)性。
5.3.1虛函數(shù)的聲明
虛函數(shù)是一個在某基類中用virtual聲明的,并在一個或多個派生類中被重新定義的成員函數(shù)。聲明虛函數(shù)的格式如下:
virtual<返回值類型><函數(shù)名>(<參數(shù)表>);
一個函數(shù)一旦聲明為虛函數(shù),則在每層派生類中,該函數(shù)都保持虛函數(shù)特性。因此,在派生類中重新定義該函數(shù)時,可以省略關(guān)鍵字virtual。但為了程序的可讀性,往往不省略。第十二頁,共二十七頁,2022年,8月28日5.3.2虛函數(shù)的使用如果某類中的一個成員函數(shù)被說明為虛函數(shù),這就意味著該成員函數(shù)在派生類中可能有不同的函數(shù)實現(xiàn)。當(dāng)使用對象指針或?qū)ο笠谜{(diào)用虛函數(shù)時,就可實現(xiàn)動態(tài)聯(liá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)編方式。第十三頁,共二十七頁,2022年,8月28日例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;}};第十四頁,共二十七頁,2022年,8月28日voidmain(){Students1,*ps;GStudents2;s1.print();s2.print();s2.Student::print();
ps=&s1;
ps->print();
ps=&s2;
ps->print();}Astudent
Agraduatestudent
Astudent
Astudent
Agraduatestudent第十五頁,共二十七頁,2022年,8月28日使用虛函數(shù)時應(yīng)注意:(1)在派生類中重新定義虛函數(shù)時,必須保證函數(shù)的返回值類型和參數(shù)與基類中的聲明完全一致。在類的成員函數(shù)被聲明為虛函數(shù)后,派生類就具有多態(tài)性。例如:#include<iostream.h>classStudent{public:
virtual
voidprint(){cout<<“Astudent”<<endl;}
};classGStudent:publicStudent{public:
virtual
voidprint()
{cout<<“Agraduatestudent”<<endl;}};第十六頁,共二十七頁,2022年,8月28日(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)用的地方,而不能等到運行時再確定調(diào)用哪個函數(shù)。第十七頁,共二十七頁,2022年,8月28日構(gòu)造函數(shù)不能是虛函數(shù)。因為構(gòu)造函數(shù)是在對象產(chǎ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ù),這樣整個派生類的對象才能被完全釋放。第十八頁,共二十七頁,2022年,8月28日5.4抽象類有時在聲明一個基類時無法為虛函數(shù)定義其具體實現(xiàn),這時可以將其聲明為一個純虛函數(shù)。包含純虛函數(shù)的類稱為抽象類。例如:classShapes
{protected:intx,y;public:voidsetvalue(intd,intw=0){x=d;y=w;}
virtual
voiddisp()=0;};第十九頁,共二十七頁,2022年,8月28日classShapes
{protected:intx,y;public:voidsetvalue(intd,intw=0){x=d;y=w;}
virtual
voiddisp()=0;};抽象類是一種特殊的類,專門作為基類派生新類,自身無法實例化,也就是無法定義抽象類的對象,它為一類族提供統(tǒng)一的操作界面。抽象類是為了抽象和設(shè)計的目的而建立的,可以說,建立抽象類,就是為了通過它多態(tài)地使用其中的成員函數(shù)。抽象類處于類層次的上層,由它派生新類,然后再實例化。第二十頁,共二十七頁,2022年,8月28日
5.4.1純虛函數(shù)的定義在C++中,一個僅為多態(tài)機制提供一個接口而沒有任何實體定義的函數(shù),被稱為純虛函數(shù)。聲明純虛函數(shù)的一般格式如下:抽象類只能用作其他類的基類,不能用來建立抽象類對象。抽象類不能用作參數(shù)類型、函數(shù)返回值類型或顯式轉(zhuǎn)換的類型,但可以說明或定義抽象類的指針或引用,該指針或引用可以指向抽象類的派生類對象,進而實現(xiàn)多態(tài)性。virtual<返回值類型><函數(shù)名>(<參數(shù)表>)=0;第二十一頁,共二十七頁,2022年,8月28日
例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();}程序的運行結(jié)果為:areaofrectangular:50第二十二頁,共二十七頁,2022年,8月28日
習(xí)題和實驗題
項目設(shè)計1----用面向?qū)ο蠓椒▽崿F(xiàn)校園信息管理系統(tǒng)1系統(tǒng)分析和設(shè)計校園信息管理系統(tǒng)的主要功能就是對在校人員(包括學(xué)生和教師)的信息資料進行管理。第二十三頁,共二十七頁,2022年,8月28日雖然系統(tǒng)有時需要將教師和學(xué)生分成兩部分單獨管理,但有時也需要將全體人員作為一類對象進行統(tǒng)一管理,以提高管理效率。系統(tǒng)除了能輸入人員信息、查詢和分析信息以外,還應(yīng)能將數(shù)據(jù)永久保存到磁盤中,以免每次運行程序時重復(fù)輸入。而且以后要用數(shù)據(jù)時能將它們從磁盤文件中讀出。2.功能模塊設(shè)計根據(jù)前面對校園信息管理系統(tǒng)基本信息和功能的需求分析,程序中應(yīng)該至少定義兩個類:
一個是學(xué)生類student,另一個是教師類teacher第二十
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 吉林省長春市長春汽車經(jīng)濟技術(shù)開發(fā)區(qū)重點名校2025屆中考二模生物試題含解析2
- 2025年度臨建工程環(huán)保驗收與監(jiān)測合同4篇
- 貪食蛇游戲課課程設(shè)計
- 2025年校園綠化養(yǎng)護與治安巡查委托管理服務(wù)協(xié)議2篇
- 2025年度棉花采摘機械銷售、租賃與市場拓展合同3篇
- 二零二五年特色餐飲店員工勞動合同模板3篇
- 2025年度金融數(shù)據(jù)分析臨時雇傭合同范本4篇
- 二零二四山林樹木碳匯項目融資合同3篇
- 二零二五年度車輛按揭轉(zhuǎn)讓與車輛貸款還款提醒合同范本3篇
- 二零二五年度池塘養(yǎng)殖水域使用權(quán)租賃合同3篇
- GA 1551.5-2019石油石化系統(tǒng)治安反恐防范要求第5部分:運輸企業(yè)
- 拘留所教育課件02
- 沖壓生產(chǎn)的品質(zhì)保障
- 《腎臟的結(jié)構(gòu)和功能》課件
- 2023年湖南聯(lián)通校園招聘筆試題庫及答案解析
- 上海市徐匯區(qū)、金山區(qū)、松江區(qū)2023屆高一上數(shù)學(xué)期末統(tǒng)考試題含解析
- 護士事業(yè)單位工作人員年度考核登記表
- 天津市新版就業(yè)、勞動合同登記名冊
- 產(chǎn)科操作技術(shù)規(guī)范范本
- 人教版八年級上冊地理全冊單元測試卷(含期中期末試卷及答案)
- 各種焊工證件比較和釋義
評論
0/150
提交評論