版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第6章章 多態(tài)性與虛函數(shù)多態(tài)性與虛函數(shù) 6.1 多態(tài)性概述多態(tài)性概述 多態(tài)性:不同對(duì)象收到相同的消息時(shí),產(chǎn)生不同的動(dòng)作。 直觀地說,多態(tài)性是指用一個(gè)名字定義不同的函數(shù),這些函數(shù)執(zhí)行不同但又類似的操作,從而可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù)。 實(shí)現(xiàn)實(shí)現(xiàn)“一個(gè)接口,多種方法一個(gè)接口,多種方法” 6.1.1 多態(tài)的分類多態(tài)的分類 C+中的多態(tài)性可以分為四類中的多態(tài)性可以分為四類: 參數(shù)多態(tài)參數(shù)多態(tài) 包含多態(tài):包含多態(tài):研究類族中定義于不同類中研究類族中定義于不同類中的同名成員函數(shù)的多態(tài)行為。的同名成員函數(shù)的多態(tài)行為。 重載多態(tài)重載多態(tài) 強(qiáng)制多態(tài)。強(qiáng)制多態(tài)。 前面兩種統(tǒng)稱為通用多
2、態(tài),而后面兩種前面兩種統(tǒng)稱為通用多態(tài),而后面兩種統(tǒng)稱為專用多態(tài)。統(tǒng)稱為專用多態(tài)。 6.1.2多態(tài)的實(shí)現(xiàn)多態(tài)的實(shí)現(xiàn) 多態(tài)從實(shí)現(xiàn)的角度來講可以劃分為兩多態(tài)從實(shí)現(xiàn)的角度來講可以劃分為兩類類:編譯時(shí)的多態(tài)編譯時(shí)的多態(tài)和和運(yùn)行時(shí)的多態(tài)運(yùn)行時(shí)的多態(tài)。 編譯時(shí)的多態(tài)編譯時(shí)的多態(tài)是通過靜態(tài)聯(lián)編來實(shí)現(xiàn)是通過靜態(tài)聯(lián)編來實(shí)現(xiàn)的。靜態(tài)聯(lián)編就是在編譯階段完成的聯(lián)編。的。靜態(tài)聯(lián)編就是在編譯階段完成的聯(lián)編。編譯時(shí)多態(tài)性主要是通過函數(shù)重載和運(yùn)算符編譯時(shí)多態(tài)性主要是通過函數(shù)重載和運(yùn)算符重載實(shí)現(xiàn)的。重載實(shí)現(xiàn)的。 運(yùn)行時(shí)的多態(tài)運(yùn)行時(shí)的多態(tài)是用動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)的。是用動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)的。動(dòng)態(tài)聯(lián)編是運(yùn)行階段完成的聯(lián)編。運(yùn)行時(shí)多動(dòng)態(tài)聯(lián)編是運(yùn)行階
3、段完成的聯(lián)編。運(yùn)行時(shí)多態(tài)性主要是通過虛函數(shù)來實(shí)現(xiàn)的。態(tài)性主要是通過虛函數(shù)來實(shí)現(xiàn)的。 6.2 虛函數(shù) 虛函數(shù)提供了一種更為靈活的多態(tài)性虛函數(shù)提供了一種更為靈活的多態(tài)性機(jī)制。虛函數(shù)允許函數(shù)調(diào)用與函數(shù)體之間機(jī)制。虛函數(shù)允許函數(shù)調(diào)用與函數(shù)體之間的聯(lián)系在運(yùn)行時(shí)才建立,也就是在運(yùn)行時(shí)的聯(lián)系在運(yùn)行時(shí)才建立,也就是在運(yùn)行時(shí)才決定如何動(dòng)作,即所謂的動(dòng)態(tài)聯(lián)編。才決定如何動(dòng)作,即所謂的動(dòng)態(tài)聯(lián)編。 6.2.1 虛函數(shù)的引入虛函數(shù)的引入 例例6.1#includeclass Apublic: void show() coutA; ;class B:public A public: void show() coutsho
4、w(); pc=&b; pc-show(); return 0; 6.2.2 虛函數(shù)的作用和定義虛函數(shù)的作用和定義 1.虛函數(shù)的作用關(guān)鍵字virtual指示編譯器,函數(shù)調(diào)用pc-show()要在運(yùn)行時(shí)確定所要調(diào)用的函數(shù),即動(dòng)態(tài)聯(lián)編。程序在運(yùn)行時(shí)根據(jù)指針PC所指向的實(shí)際對(duì)象調(diào)用該對(duì)象的函數(shù)。虛函數(shù)同派生類的結(jié)合可使C+支持運(yùn)行時(shí)的多態(tài)性,實(shí)現(xiàn)了在基類定義派生類所擁有的通用接口,而在派生類定義具體的實(shí)現(xiàn)方法,即常說的“同一接口,多種方法”,它幫助程序員處理越來越復(fù)雜的程序。 例6.2#includeclass A public: virtual void show() coutA; ;cl
5、ass B:public A public: void show() coutshow(); pc=&b; pc-show(); return 0; 2. 虛函數(shù)的定義虛函數(shù)的定義定義虛函數(shù)的方法如下定義虛函數(shù)的方法如下:virtual 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(形參表形參表) / 函數(shù)體函數(shù)體 例6.4 虛函數(shù)的定義舉例。#includeclass Grandam public: virtual void introduce_self() coutI am grandam.endl; ;class Mother:public Grandam public: void intro
6、duce_self() / 重新定義虛函數(shù)introduce_self() coutI am mother.endl;class Daughter:public Mother public: void introduce_self() / 重新定義虛函數(shù)introduce_self() coutI am roduce_self();/調(diào)用基類調(diào)用基類Grandam的的introduce_self() ptr=&m; ptr-introduce_self();/ 調(diào)用派生類調(diào)用派生類Mother的的introduce_self() ptr=&d; ptr-
7、introduce_self(); /調(diào)用派生類調(diào)用派生類 / Daughter的的introduce_self() 說明:說明: 派生類應(yīng)從基類公有派生。派生類應(yīng)從基類公有派生。 必須首先在基類中定義虛函數(shù)。必須首先在基類中定義虛函數(shù)。 在派生類中對(duì)基類中聲明的虛函數(shù)進(jìn)行重新定義在派生類中對(duì)基類中聲明的虛函數(shù)進(jìn)行重新定義時(shí),關(guān)鍵字可以寫也可以不寫。時(shí),關(guān)鍵字可以寫也可以不寫。 只有通過基類指針訪問虛函數(shù)時(shí)才能獲得運(yùn)行時(shí)只有通過基類指針訪問虛函數(shù)時(shí)才能獲得運(yùn)行時(shí)多態(tài)多態(tài) 繼承性繼承性 虛函數(shù)必須是成員函數(shù),不能是友元函數(shù)和靜態(tài)虛函數(shù)必須是成員函數(shù),不能是友元函數(shù)和靜態(tài)成員函數(shù)。成員函數(shù)。 虛函
8、數(shù)不能是內(nèi)聯(lián)函數(shù)。虛函數(shù)不能是內(nèi)聯(lián)函數(shù)。 構(gòu)造函數(shù)不可以,析構(gòu)函數(shù)可以。構(gòu)造函數(shù)不可以,析構(gòu)函數(shù)可以。當(dāng)派生類的成員函數(shù)沒有寫vitual時(shí),判斷派生類的一個(gè)成員為虛函數(shù)的方法: 該函數(shù)與基類的虛函數(shù)有相同的名稱; 該函數(shù)與基類的虛函數(shù)有相同的參數(shù)個(gè)數(shù)及相同的對(duì)應(yīng)參數(shù)類型 該函數(shù)與基類的虛函數(shù)有相同的返回類型6.2.3虛析構(gòu)函數(shù):格式:virtual 類名();說明:如果一個(gè)類的析構(gòu)函數(shù)是虛函數(shù),則由它派生而來的所有派生類的析構(gòu)函數(shù)也是虛函數(shù)。作用:保證使用基類類型的指針能夠調(diào)用適當(dāng)?shù)奈鰳?gòu)函數(shù)針對(duì)不同對(duì)象進(jìn)行清理工作。例6.4#include #include class Apublic: v
9、irtual A() coutjilei-xigou endl;class B:public Aprivate:char *c;public:B(char *message)c=new charstrlen(message)+1;strcpy(c,message); B()delete c;coutpaishenglei-xigouendl;void main()A *pa;pa=new B(DD);delete pa;6.2.4虛函數(shù)與重載函數(shù)的關(guān)系虛函數(shù)與重載函數(shù)的關(guān)系 區(qū)別:區(qū)別: 普通的函數(shù)重載時(shí),其函數(shù)的參數(shù)或參數(shù)類型必須有所普通的函數(shù)重載時(shí),其函數(shù)的參數(shù)或參數(shù)類型必須有所不同,函數(shù)
10、的返回類型也可以不同。不同,函數(shù)的返回類型也可以不同。 當(dāng)重載一個(gè)虛函數(shù)時(shí),也就是說在派生類中重新定義虛當(dāng)重載一個(gè)虛函數(shù)時(shí),也就是說在派生類中重新定義虛函數(shù)時(shí),要求函數(shù)名、返回類型、參數(shù)個(gè)數(shù)、參數(shù)的類型和函數(shù)時(shí),要求函數(shù)名、返回類型、參數(shù)個(gè)數(shù)、參數(shù)的類型和順序與基類中的虛函數(shù)原型完全相同。順序與基類中的虛函數(shù)原型完全相同。 如果僅僅返回類型不同,其余均相同,系統(tǒng)會(huì)給出錯(cuò)誤如果僅僅返回類型不同,其余均相同,系統(tǒng)會(huì)給出錯(cuò)誤信息信息; 若僅僅函數(shù)名相同,而參數(shù)的個(gè)數(shù)、類型或順序不同,若僅僅函數(shù)名相同,而參數(shù)的個(gè)數(shù)、類型或順序不同,系統(tǒng)將它作為普通的函數(shù)重載,這時(shí)將丟失虛函數(shù)的特性。系統(tǒng)將它作為普通的
11、函數(shù)重載,這時(shí)將丟失虛函數(shù)的特性。6.2.多繼承與函數(shù)多繼承與函數(shù)6.3 純虛函數(shù)和抽象類純虛函數(shù)和抽象類 6.3.1 純虛函數(shù)純虛函數(shù) 純虛函數(shù)是一個(gè)在基類中說明的虛純虛函數(shù)是一個(gè)在基類中說明的虛函數(shù),它在該基類中沒有定義,但要求函數(shù),它在該基類中沒有定義,但要求在它的派生類中必須定義自己的版本,在它的派生類中必須定義自己的版本,或重新說明為純虛函數(shù)?;蛑匦抡f明為純虛函數(shù)。 純虛函數(shù)的定義形式如下純虛函數(shù)的定義形式如下: virtual 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(參數(shù)表參數(shù)表)=0; 例例6.9純虛函數(shù)的使用。純虛函數(shù)的使用。#includeclass Circle public: v
12、oid setr(int x) r=x; virtual void show()=0; / 純虛函數(shù)純虛函數(shù)protected: int r;class Area:public Circlepublic: void show() coutArea is 3.14*r*rendl; / 重定義虛函數(shù)重定義虛函數(shù)show( )class Perimeter:public Circlepublic: void show()coutPerimeter is 2*3.14*rshow(); ptr=&ob2; ptr-show(); 6.3.2 抽象類抽象類 如果一個(gè)類至少有一個(gè)純虛函數(shù),那么如
13、果一個(gè)類至少有一個(gè)純虛函數(shù),那么就稱該類為抽象類。就稱該類為抽象類。 抽象類只能作為其他類的基類來使用,抽象類只能作為其他類的基類來使用,不能建立抽象類對(duì)象,其純虛函數(shù)的實(shí)現(xiàn)不能建立抽象類對(duì)象,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。由派生類給出。 說明:說明: 抽象類只能作為其他類的基類來使用,不能建立抽象類對(duì)抽象類只能作為其他類的基類來使用,不能建立抽象類對(duì)象,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。象,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。 不允許從具體類派生出抽象類。不允許從具體類派生出抽象類。 抽象類不能用作參數(shù)類型、函數(shù)返回類型或顯式轉(zhuǎn)換類型。抽象類不能用作參數(shù)類型、函數(shù)返回類型或顯式轉(zhuǎn)換類型。 可以聲明指向抽象類的指針或引用,此指針可以指向它的可以聲明指向抽象類的指針或引用,此指針可以指向它的派生類,進(jìn)而實(shí)現(xiàn)多態(tài)。派生類,進(jìn)而實(shí)現(xiàn)多態(tài)。 如果派生類中沒有重定義純虛函數(shù),而派生類只是繼承基
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度餐飲業(yè)外賣配送合作協(xié)議3篇
- 2024美團(tuán)商家入駐平臺(tái)合作協(xié)議及客戶服務(wù)承諾3篇
- 2024熟石灰采購合同范本
- 二零二五版高端個(gè)性化二婚離婚補(bǔ)償協(xié)議定制合同
- 2025年度金融科技產(chǎn)品服務(wù)水平協(xié)議2篇
- 2024年項(xiàng)目性勞動(dòng)合同
- 2025版公立醫(yī)療機(jī)構(gòu)與學(xué)校醫(yī)務(wù)室共建項(xiàng)目合同3篇
- 二零二五版民品典當(dāng)借款合同法律適用說明4篇
- 租賃合同(2025年度):魚池場地租賃、養(yǎng)殖技術(shù)指導(dǎo)及分成3篇
- 長白山職業(yè)技術(shù)學(xué)院《漢字及其教學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 海外資管機(jī)構(gòu)赴上海投資指南(2024版)
- 山東省青島市2023-2024學(xué)年七年級(jí)上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 墓地銷售計(jì)劃及方案設(shè)計(jì)書
- 從偏差行為到卓越一生3.0版
- 優(yōu)佳學(xué)案七年級(jí)上冊(cè)歷史
- 鋁箔行業(yè)海外分析
- 紀(jì)委辦案安全培訓(xùn)課件
- 超市連鎖行業(yè)招商策劃
- 城市道路智慧路燈項(xiàng)目 投標(biāo)方案(技術(shù)標(biāo))
- 【公司利潤質(zhì)量研究國內(nèi)外文獻(xiàn)綜述3400字】
- 工行全國地區(qū)碼
評(píng)論
0/150
提交評(píng)論