面向?qū)ο蟮谖逭耞第1頁
面向?qū)ο蟮谖逭耞第2頁
面向?qū)ο蟮谖逭耞第3頁
面向?qū)ο蟮谖逭耞第4頁
面向?qū)ο蟮谖逭耞第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論