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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

面向?qū)ο蟮谖逭碌?頁,共27頁,2023年,2月20日,星期四本章的學(xué)習(xí)內(nèi)容多態(tài)性的概念靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編的概念虛函數(shù)的概念抽象類的概念第2頁,共27頁,2023年,2月20日,星期四

5.1多態(tài)性的概念

多態(tài)性是指在類層次結(jié)構(gòu)的相同類或不同類中,可用相同的函數(shù)名實(shí)現(xiàn)功能不同的操作,從而可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù),實(shí)現(xiàn)不同情況下的不同操作。如下圖所示。第3頁,共27頁,2023年,2月20日,星期四C++的多態(tài)性可使同一條消息,被不同類型的對(duì)象接收時(shí)將產(chǎn)生不同的行為。多態(tài)性是實(shí)現(xiàn)“一種接口,多種方法”的技術(shù)。這里的“一種接口”是指相同函數(shù)名和參數(shù)表,而“多種方法”是指多種函數(shù)實(shí)現(xiàn),實(shí)現(xiàn)相似但不完全相同的功能。第4頁,共27頁,2023年,2月20日,星期四C++支持的多態(tài)可以分為兩種類型:編譯時(shí)多態(tài):在同一個(gè)類或不同類中可用相同的函數(shù)名和不同的參數(shù)表來實(shí)現(xiàn)不同的功能操作,編譯系統(tǒng)在編譯階段就可以根據(jù)調(diào)用函數(shù)的參數(shù)表來確定調(diào)用哪個(gè)同名函數(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;……}第5頁,共27頁,2023年,2月20日,星期四運(yùn)行時(shí)多態(tài):在類的繼承層次結(jié)構(gòu)中,不同層次的類中可能具有同名但實(shí)現(xiàn)不同的函數(shù),需要在運(yùn)行階段才能根據(jù)對(duì)象所屬的層次來確定調(diào)用哪個(gè)類中的同名函數(shù)。第6頁,共27頁,2023年,2月20日,星期四5.2聯(lián)編多態(tài)性的實(shí)現(xiàn)過程中,把一個(gè)消息函數(shù)(如student1.display())與一個(gè)對(duì)象的具體函數(shù)體相聯(lián)系的過程叫做聯(lián)編(binding)。按照聯(lián)編時(shí)所處階段的不同,可以把聯(lián)編分為靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編,這兩種聯(lián)編過程分別對(duì)應(yīng)著多態(tài)性的兩種實(shí)現(xiàn)方式。5.2.1靜態(tài)聯(lián)編

在編譯階段由編譯系統(tǒng)根據(jù)調(diào)用函數(shù)的操作參數(shù)來確定調(diào)用哪個(gè)同名函數(shù),并將函數(shù)調(diào)用與該函數(shù)體連接起來.第7頁,共27頁,2023年,2月20日,星期四例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;}};第8頁,共27頁,2023年,2月20日,星期四voidmain(){Students1,*ps;GStudents2;s1.print();s2.print();s2.Student::print();ps=&s1;ps->print();ps=&s2;ps->print();}

Astudent

Agraduatestudent

Astudent

Astudent

Astudent第9頁,共27頁,2023年,2月20日,星期四5.2.2動(dòng)態(tài)聯(lián)編只有在運(yùn)行程序時(shí)才能根據(jù)函數(shù)調(diào)用指令來確定將要調(diào)用的函數(shù),這種在運(yùn)行階段進(jìn)行的聯(lián)編稱為動(dòng)態(tài)聯(lián)編。例如,下例中用指針調(diào)用同名函數(shù)。第10頁,共27頁,2023年,2月20日,星期四動(dòng)態(tài)聯(lián)編的優(yōu)點(diǎn)是提供了更好的編程靈活性、問題的抽象性和程序的易維護(hù)性,缺點(diǎn)是與靜態(tài)聯(lián)編相比,函數(shù)調(diào)用速度慢。(如p->print();

)問題的抽象性:在實(shí)際應(yīng)用中,編程人員不必過多地考慮類的層次關(guān)系,無須顯式地寫出虛函數(shù)的路徑,只需將對(duì)象指針指向相應(yīng)的派生類對(duì)象或引用相應(yīng)的對(duì)象,通過動(dòng)態(tài)聯(lián)編就可以對(duì)消息做出正確的反應(yīng)。(如p->print();

)第11頁,共27頁,2023年,2月20日,星期四5.3虛函數(shù)

虛函數(shù)是動(dòng)態(tài)聯(lián)編的基礎(chǔ)?;惖奶摵瘮?shù)經(jīng)過派生之后,在類族中可以實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性。

5.3.1虛函數(shù)的聲明

虛函數(shù)是一個(gè)在某基類中用virtual聲明的,并在一個(gè)或多個(gè)派生類中被重新定義的成員函數(shù)。聲明虛函數(shù)的格式如下:

virtual<返回值類型><函數(shù)名>(<參數(shù)表>);

一個(gè)函數(shù)一旦聲明為虛函數(shù),則在每層派生類中,該函數(shù)都保持虛函數(shù)特性。因此,在派生類中重新定義該函數(shù)時(shí),可以省略關(guān)鍵字virtual。但為了程序的可讀性,往往不省略。第12頁,共27頁,2023年,2月20日,星期四5.3.2虛函數(shù)的使用如果某類中的一個(gè)成員函數(shù)被說明為虛函數(shù),這就意味著該成員函數(shù)在派生類中可能有不同的函數(shù)實(shí)現(xiàn)。當(dāng)使用對(duì)象指針或?qū)ο笠谜{(diào)用虛函數(shù)時(shí),就可實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編,即在運(yùn)行時(shí)進(jìn)行關(guān)聯(lián)或綁定。定義一個(gè)基類的對(duì)象指針就可以指向不同派生類的對(duì)象,來調(diào)用不同派生類的虛函數(shù);(2)只有通過對(duì)象指針或?qū)ο笠脕碚{(diào)用虛函數(shù),才能實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。如果采用對(duì)象來調(diào)用虛函數(shù),則采用的仍然是靜態(tài)聯(lián)編方式。第13頁,共27頁,2023年,2月20日,星期四例5-2靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編

#include<iostream.h>classStudent{public:

virtual

voidprint(){cout<<“Astudent”<<endl;}

};classGStudent:publicStudent{public:

virtualvoidprint(){cout<<“Agraduatestudent”<<endl;}};第14頁,共27頁,2023年,2月20日,星期四voidmain(){Students1,*ps;GStudents2;s1.print();s2.print();s2.Student::print();

ps=&s1;

ps->print();

ps=&s2;

ps->print();}Astudent

Agraduatestudent

Astudent

Astudent

Agraduatestudent第15頁,共27頁,2023年,2月20日,星期四使用虛函數(shù)時(shí)應(yīng)注意:(1)在派生類中重新定義虛函數(shù)時(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;}};第16頁,共27頁,2023年,2月20日,星期四(2)一般來說,可將類族中的具有共性的成員函數(shù)聲明為虛函數(shù),而具有個(gè)性的函數(shù)沒有必要聲明為虛函數(shù)。如果在派生類中沒有重新定義虛函數(shù),則派生類的對(duì)象將使用基類的虛函數(shù)代碼。靜態(tài)成員函數(shù)不能聲明為虛函數(shù)。內(nèi)聯(lián)成員函數(shù)不能聲明為虛函數(shù)。因?yàn)閷?duì)于內(nèi)聯(lián)成員函數(shù),在程序編譯時(shí),編譯系統(tǒng)就應(yīng)明確用哪個(gè)函數(shù)體替換內(nèi)聯(lián)函數(shù)調(diào)用的地方,而不能等到運(yùn)行時(shí)再確定調(diào)用哪個(gè)函數(shù)。第17頁,共27頁,2023年,2月20日,星期四構(gòu)造函數(shù)不能是虛函數(shù)。因?yàn)闃?gòu)造函數(shù)是在對(duì)象產(chǎn)生之前運(yùn)行的,而虛函數(shù)是使用已有對(duì)象或其指針來調(diào)用的函數(shù)。所以,將構(gòu)造函數(shù)聲明為虛函數(shù)是沒有意義的。析構(gòu)函數(shù)可以是虛函數(shù),且往往被定義成虛函數(shù)。因?yàn)閷?shí)施多態(tài)時(shí)是通過將基類的指針指向派生類的對(duì)象來完成的,如果要?jiǎng)h除該指針?biāo)傅呐缮悓?duì)象時(shí)就應(yīng)該調(diào)用該指針?biāo)赶虻呐缮惖奈鰳?gòu)函數(shù),然后派生類的析構(gòu)函數(shù)又調(diào)用基類的析構(gòu)函數(shù),這樣整個(gè)派生類的對(duì)象才能被完全釋放。第18頁,共27頁,2023年,2月20日,星期四5.4抽象類有時(shí)在聲明一個(gè)基類時(shí)無法為虛函數(shù)定義其具體實(shí)現(xiàn),這時(shí)可以將其聲明為一個(gè)純虛函數(shù)。包含純虛函數(shù)的類稱為抽象類。例如:classShapes

{protected:intx,y;public:voidsetvalue(intd,intw=0){x=d;y=w;}

virtual

voiddisp()=0;};第19頁,共27頁,2023年,2月20日,星期四classShapes

{protected:intx,y;public:voidsetvalue(intd,intw=0){x=d;y=w;}

virtual

voiddisp()=0;};抽象類是一種特殊的類,專門作為基類派生新類,自身無法實(shí)例化,也就是無法定義抽象類的對(duì)象,它為一類族提供統(tǒng)一的操作界面。抽象類是為了抽象和設(shè)計(jì)的目的而建立的,可以說,建立抽象類,就是為了通過它多態(tài)地使用其中的成員函數(shù)。抽象類處于類層次的上層,由它派生新類,然后再實(shí)例化。第20頁,共27頁,2023年,2月20日,星期四

5.4.1純虛函數(shù)的定義在C++中,一個(gè)僅為多態(tài)機(jī)制提供一個(gè)接口而沒有任何實(shí)體定義的函數(shù),被稱為純虛函數(shù)。聲明純虛函數(shù)的一般格式如下:抽象類只能用作其他類的基類,不能用來建立抽象類對(duì)象。抽象類不能用作參數(shù)類型、函數(shù)返回值類型或顯式轉(zhuǎn)換的類型,但可以說明或定義抽象類的指針或引用,該指針或引用可以指向抽象類的派生類對(duì)象,進(jìn)而實(shí)現(xiàn)多態(tài)性。virtual<返回值類型><函數(shù)名>(<參數(shù)表>)=0;第21頁,共27頁,2023年,2月20日,星期四

例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第22頁,共27頁,2023年,2月20日,星期四

習(xí)題和實(shí)驗(yàn)題

項(xiàng)目設(shè)計(jì)1----用面向?qū)ο蠓椒▽?shí)現(xiàn)校園信息管理系統(tǒng)1系統(tǒng)分析和設(shè)計(jì)校園信息管理系統(tǒng)的主要功能就是對(duì)在校人員(包括學(xué)生和教師)的信息資料進(jìn)行管理。第23頁,共27頁,2023年,2月20日,星期四雖然系統(tǒng)有時(shí)需要將教師和學(xué)生分成兩部分單獨(dú)管理,但有時(shí)也需要將全體人員作為一類對(duì)象進(jìn)行統(tǒng)一管理,以提高管理效率。系統(tǒng)除了能輸入人員信息、查詢和分析信息以外,還應(yīng)能將數(shù)據(jù)永久保存到磁盤中,以免每次運(yùn)行程序時(shí)重復(fù)輸入。而且以后要用數(shù)據(jù)時(shí)能將它們從磁盤文件中讀出。2.功能模塊設(shè)計(jì)根據(jù)前面對(duì)校園信息管理系統(tǒng)基本信息和功能的需求分析,程序中應(yīng)該至少定義兩個(gè)類:

一個(gè)是學(xué)生類student,另一個(gè)是教師類teacher第24

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論