![面向對象第五章_第1頁](http://file4.renrendoc.com/view/d2ce8b3580b349988db80d468b547555/d2ce8b3580b349988db80d468b5475551.gif)
![面向對象第五章_第2頁](http://file4.renrendoc.com/view/d2ce8b3580b349988db80d468b547555/d2ce8b3580b349988db80d468b5475552.gif)
![面向對象第五章_第3頁](http://file4.renrendoc.com/view/d2ce8b3580b349988db80d468b547555/d2ce8b3580b349988db80d468b5475553.gif)
![面向對象第五章_第4頁](http://file4.renrendoc.com/view/d2ce8b3580b349988db80d468b547555/d2ce8b3580b349988db80d468b5475554.gif)
![面向對象第五章_第5頁](http://file4.renrendoc.com/view/d2ce8b3580b349988db80d468b547555/d2ce8b3580b349988db80d468b5475555.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
面向對象第五章第一頁,共二十七頁,2022年,8月28日本章的學習內容多態(tài)性的概念靜態(tài)聯(lián)編和動態(tài)聯(lián)編的概念虛函數的概念抽象類的概念
第二頁,共二十七頁,2022年,8月28日
5.1多態(tài)性的概念
多態(tài)性是指在類層次結構的相同類或不同類中,可用相同的函數名實現功能不同的操作,從而可以使用相同的調用方式來調用這些具有不同功能的同名函數,實現不同情況下的不同操作。如下圖所示。第三頁,共二十七頁,2022年,8月28日C++的多態(tài)性可使同一條消息,被不同類型的對象接收時將產生不同的行為。多態(tài)性是實現“一種接口,多種方法”的技術。這里的“一種接口”是指相同函數名和參數表,而“多種方法”是指多種函數實現,實現相似但不完全相同的功能。第四頁,共二十七頁,2022年,8月28日C++支持的多態(tài)可以分為兩種類型:編譯時多態(tài):在同一個類或不同類中可用相同的函數名和不同的參數表來實現不同的功能操作,編譯系統(tǒng)在編譯階段就可以根據調用函數的參數表來確定調用哪個同名函數。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):在類的繼承層次結構中,不同層次的類中可能具有同名但實現不同的函數,需要在運行階段才能根據對象所屬的層次來確定調用哪個類中的同名函數。第六頁,共二十七頁,2022年,8月28日5.2聯(lián)編多態(tài)性的實現過程中,把一個消息函數(如student1.display())與一個對象的具體函數體相聯(lián)系的過程叫做聯(lián)編(binding)。按照聯(lián)編時所處階段的不同,可以把聯(lián)編分為靜態(tài)聯(lián)編和動態(tài)聯(lián)編,這兩種聯(lián)編過程分別對應著多態(tài)性的兩種實現方式。5.2.1靜態(tài)聯(lián)編
在編譯階段由編譯系統(tǒng)根據調用函數的操作參數來確定調用哪個同名函數,并將函數調用與該函數體連接起來.第七頁,共二十七頁,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)編只有在運行程序時才能根據函數調用指令來確定將要調用的函數,這種在運行階段進行的聯(lián)編稱為動態(tài)聯(lián)編。例如,下例中用指針調用同名函數。第十頁,共二十七頁,2022年,8月28日動態(tài)聯(lián)編的優(yōu)點是提供了更好的編程靈活性、問題的抽象性和程序的易維護性,缺點是與靜態(tài)聯(lián)編相比,函數調用速度慢。(如p->print();
)問題的抽象性:在實際應用中,編程人員不必過多地考慮類的層次關系,無須顯式地寫出虛函數的路徑,只需將對象指針指向相應的派生類對象或引用相應的對象,通過動態(tài)聯(lián)編就可以對消息做出正確的反應。(如p->print();
)第十一頁,共二十七頁,2022年,8月28日5.3虛函數
虛函數是動態(tài)聯(lián)編的基礎。基類的虛函數經過派生之后,在類族中可以實現運行時的多態(tài)性。
5.3.1虛函數的聲明
虛函數是一個在某基類中用virtual聲明的,并在一個或多個派生類中被重新定義的成員函數。聲明虛函數的格式如下:
virtual<返回值類型><函數名>(<參數表>);
一個函數一旦聲明為虛函數,則在每層派生類中,該函數都保持虛函數特性。因此,在派生類中重新定義該函數時,可以省略關鍵字virtual。但為了程序的可讀性,往往不省略。第十二頁,共二十七頁,2022年,8月28日5.3.2虛函數的使用如果某類中的一個成員函數被說明為虛函數,這就意味著該成員函數在派生類中可能有不同的函數實現。當使用對象指針或對象引用調用虛函數時,就可實現動態(tài)聯(lián)編,即在運行時進行關聯(lián)或綁定。定義一個基類的對象指針就可以指向不同派生類的對象,來調用不同派生類的虛函數;(2)只有通過對象指針或對象引用來調用虛函數,才能實現動態(tài)聯(lián)編。如果采用對象來調用虛函數,則采用的仍然是靜態(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日使用虛函數時應注意:(1)在派生類中重新定義虛函數時,必須保證函數的返回值類型和參數與基類中的聲明完全一致。在類的成員函數被聲明為虛函數后,派生類就具有多態(tài)性。例如:#include<iostream.h>classStudent{public:
virtual
voidprint(){cout<<“Astudent”<<endl;}
};classGStudent:publicStudent{public:
virtual
voidprint()
{cout<<“Agraduatestudent”<<endl;}};第十六頁,共二十七頁,2022年,8月28日(2)一般來說,可將類族中的具有共性的成員函數聲明為虛函數,而具有個性的函數沒有必要聲明為虛函數。如果在派生類中沒有重新定義虛函數,則派生類的對象將使用基類的虛函數代碼。靜態(tài)成員函數不能聲明為虛函數。內聯(lián)成員函數不能聲明為虛函數。因為對于內聯(lián)成員函數,在程序編譯時,編譯系統(tǒng)就應明確用哪個函數體替換內聯(lián)函數調用的地方,而不能等到運行時再確定調用哪個函數。第十七頁,共二十七頁,2022年,8月28日構造函數不能是虛函數。因為構造函數是在對象產生之前運行的,而虛函數是使用已有對象或其指針來調用的函數。所以,將構造函數聲明為虛函數是沒有意義的。析構函數可以是虛函數,且往往被定義成虛函數。因為實施多態(tài)時是通過將基類的指針指向派生類的對象來完成的,如果要刪除該指針所指的派生類對象時就應該調用該指針所指向的派生類的析構函數,然后派生類的析構函數又調用基類的析構函數,這樣整個派生類的對象才能被完全釋放。第十八頁,共二十七頁,2022年,8月28日5.4抽象類有時在聲明一個基類時無法為虛函數定義其具體實現,這時可以將其聲明為一個純虛函數。包含純虛函數的類稱為抽象類。例如: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)一的操作界面。抽象類是為了抽象和設計的目的而建立的,可以說,建立抽象類,就是為了通過它多態(tài)地使用其中的成員函數。抽象類處于類層次的上層,由它派生新類,然后再實例化。第二十頁,共二十七頁,2022年,8月28日
5.4.1純虛函數的定義在C++中,一個僅為多態(tài)機制提供一個接口而沒有任何實體定義的函數,被稱為純虛函數。聲明純虛函數的一般格式如下:抽象類只能用作其他類的基類,不能用來建立抽象類對象。抽象類不能用作參數類型、函數返回值類型或顯式轉換的類型,但可以說明或定義抽象類的指針或引用,該指針或引用可以指向抽象類的派生類對象,進而實現多態(tài)性。virtual<返回值類型><函數名>(<參數表>)=0;第二十一頁,共二十七頁,2022年,8月28日
例5-3抽象類的定義和應用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();}程序的運行結果為:areaofrectangular:50第二十二頁,共二十七頁,2022年,8月28日
習題和實驗題
項目設計1----用面向對象方法實現校園信息管理系統(tǒng)1系統(tǒng)分析和設計校園信息管理系統(tǒng)的主要功能就是對在校人員(包括學生和教師)的信息資料進行管理。第二十三頁,共二十七頁,2022年,8月28日雖然系統(tǒng)有時需要將教師和學生分成兩部分單獨管理,但有時也需要將全體人員作為一類對象進行統(tǒng)一管理,以提高管理效率。系統(tǒng)除了能輸入人員信息、查詢和分析信息以外,還應能將數據永久保存到磁盤中,以免每次運行程序時重復輸入。而且以后要用數據時能將它們從磁盤文件中讀出。2.功能模塊設計根據前面對校園信息管理系統(tǒng)基本信息和功能的需求分析,程序中應該至少定義兩個類:
一個是學生類student,另一個是教師類teacher第二十
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年浙教版選修4歷史上冊月考試卷含答案
- 2025年浙教新版高二數學上冊月考試卷
- 2025年新世紀版九年級歷史上冊階段測試試卷含答案
- 2025年粵教版選修5歷史下冊月考試卷
- 2025年浙教版八年級科學下冊階段測試試卷
- 2025年廣西經濟職業(yè)學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年山東勝利職業(yè)學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年山東科技職業(yè)學院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 2025年天津藝術職業(yè)學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年天津海運職業(yè)學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年中考英語復習熱點話題作文范文
- 小學數學教學工作交流數學教學中的體會總結經驗交流會課件
- 2024年美國智能馬桶和馬桶蓋市場現狀及上下游分析報告
- 中國成人暴發(fā)性心肌炎診斷和治療指南(2023版)解讀
- 復產復工六個一
- 商業(yè)綜合體投資計劃書
- 《鋼鐵是怎樣煉成的》練習題(含答案)
- 急診酒精中毒護理查房
- 碳纖維加固定額B013
- 脊柱外科進修匯報
- 測繪工程產品價格表匯編
評論
0/150
提交評論