




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
多態(tài)性用同樣的接口訪問功能不同的函數(shù)第一頁,共二十二頁,編輯于2023年,星期五函數(shù)聯(lián)編靜態(tài)聯(lián)編:指系統(tǒng)在編譯時(shí)就決定如何實(shí)現(xiàn)某個(gè)動(dòng)作。特點(diǎn):要求在程序編譯時(shí)就知道調(diào)用函數(shù)的全部信息。函數(shù)調(diào)用速度很快,效率高通過函數(shù)重載而后運(yùn)算符重載實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編:指系統(tǒng)在運(yùn)行時(shí)動(dòng)態(tài)實(shí)現(xiàn)某個(gè)動(dòng)作特點(diǎn):要到程序運(yùn)行時(shí)才能確定調(diào)用哪個(gè)函數(shù)提供更好的靈活性、問題抽象性和程序易維護(hù)性通過繼承和虛函數(shù)實(shí)現(xiàn)第二頁,共二十二頁,編輯于2023年,星期五靜態(tài)聯(lián)編(通過對(duì)象的類型區(qū)別)重新在派生類中定義基類的函數(shù)classpoint{…floatarea(){return0.0;}};classcircle:publicpoint{…floatarea(){return3.14159*r*r;}};voidmain(){pointp;p.area();調(diào)用point類的函數(shù)
circlec;c.area();調(diào)用circle類的函數(shù)}通過對(duì)象的類型區(qū)別第三頁,共二十二頁,編輯于2023年,星期五運(yùn)行時(shí)的多態(tài)性指定關(guān)鍵字virtual,在運(yùn)行時(shí)對(duì)函數(shù)動(dòng)態(tài)聯(lián)編,根據(jù)實(shí)際對(duì)象,調(diào)用該對(duì)象的成員函數(shù)voidmain(){point*p;circlec;p=&c;p->area();結(jié)果調(diào)用point類的area將關(guān)鍵字virtual放在類中area函數(shù)的函數(shù)說明之前:virtualfloatarea(){return0.0;}則結(jié)果調(diào)用circle類的area通過指針?biāo)鸬膶?duì)普通成員函數(shù)的調(diào)用,僅僅由聲明指針的類型決定,而與當(dāng)時(shí)指針實(shí)際指向什么對(duì)象無關(guān)。第四頁,共二十二頁,編輯于2023年,星期五虛函數(shù)虛函數(shù):為實(shí)現(xiàn)某種功能而假設(shè)的函數(shù),虛函數(shù)只能是類中的一個(gè)成員函數(shù),不能是靜態(tài)成員格式:virtual數(shù)據(jù)類型函數(shù)名(參數(shù))說明:首先在基類中聲明虛函數(shù)(需要具有動(dòng)態(tài)多態(tài)性的基類)在派生類中某個(gè)成員函數(shù)的參數(shù)個(gè)數(shù)、相應(yīng)類型和返回類型與基類同名的虛函數(shù)一樣(即使沒有virtual),則該成員函數(shù)為虛函數(shù)不允許在派生類中定義與基類僅僅返回類型不同的函數(shù)派生類中定義與基類虛函數(shù)同名但參數(shù)不同的函數(shù),則該函數(shù)不為虛函數(shù)。對(duì)虛函數(shù)保證在通過一個(gè)基類類型的指針調(diào)用一個(gè)虛函數(shù)時(shí),系統(tǒng)對(duì)該調(diào)用進(jìn)行動(dòng)態(tài)聯(lián)編。對(duì)虛函數(shù)在通過一對(duì)象調(diào)用一個(gè)虛函數(shù)時(shí),系統(tǒng)對(duì)該調(diào)用進(jìn)行靜態(tài)聯(lián)編。在調(diào)用中對(duì)虛函數(shù)使用成員名限定可強(qiáng)制對(duì)該函數(shù)的調(diào)用使用靜態(tài)聯(lián)編。第五頁,共二十二頁,編輯于2023年,星期五voidmain(){circlec;circle&c1=c;c1.area();結(jié)果調(diào)用circle類的areapoint&p=c;p.area();結(jié)果調(diào)用circle類的areap.point::area()結(jié)果調(diào)用point類的area}使用普通對(duì)象調(diào)用虛函數(shù),系統(tǒng)以靜態(tài)聯(lián)編方式完成對(duì)虛函數(shù)的調(diào)用。即用哪個(gè)類說明的對(duì)象,就調(diào)用在那個(gè)類中定義的虛函數(shù)。為達(dá)到動(dòng)態(tài)聯(lián)編獲得運(yùn)行時(shí)多態(tài)性的效果,用指向第一次定義虛函數(shù)的基類對(duì)象的指針(引用)來調(diào)用虛函數(shù)虛函數(shù)第六頁,共二十二頁,編輯于2023年,星期五classB{public:virtualvoidvf1();virtualvoidvf2();virtualvoidvf3();voidf();};classD:publicB{public:virtualvoidvf1();虛函數(shù)voidvf2(int);普通重載voidf();普通重載virtualvoidvf4();虛函數(shù)(基類相對(duì))};classDD:publicD{public:voidvf4();虛函數(shù)voidvf2();虛函數(shù)voidvf3();虛函數(shù)Bb;Dd;B*bp=&d;bp->vf1();調(diào)用D::vf1bp->vf2();調(diào)用B::vf2bp->vf2(5);語法錯(cuò)bp->f();調(diào)用B::fd.vf2();語法錯(cuò)b=d;賦值兼容b.vf1();調(diào)用B::vf1DDdd;D*dp=ⅆdp->vf4();調(diào)用DD::vf4dp->vf2();語法錯(cuò)dp->vf3();調(diào)用DD::vf3bp=ⅆbp->vf2();調(diào)用DD::vf2
第七頁,共二十二頁,編輯于2023年,星期五虛函數(shù)的訪問權(quán)限派生類中定義的虛函數(shù)的訪問權(quán)限不影響對(duì)它進(jìn)行動(dòng)態(tài)聯(lián)編。一個(gè)類中的虛函數(shù)說明只對(duì)派生類中重定義的函數(shù)有影響,對(duì)它的基類中的函數(shù)無影響classA{public:
voidfunc()…};classB:publicA{public:virtualvoidfunc()…};classC:publicB{public:
voidfunc()…};Ccc.func();c.B::func();A&a=c;a.func();B&b=c;b.func();b.B::func();第八頁,共二十二頁,編輯于2023年,星期五在成員函數(shù)中調(diào)用虛函數(shù)在一個(gè)基類或派生類的成員函數(shù)中可直接調(diào)用該類等級(jí)中的虛函數(shù)classB:publicA{public:voidfun3(){...fun4();}voidfun4(){…fun5();}…調(diào)用自身類中虛函數(shù)調(diào)用自身類中函數(shù)thing->fun1();由于fun1是虛函數(shù),所以thing可指向A類對(duì)象,也可指向B類對(duì)象thing->fun5();由于fun5不是虛函數(shù),而是普通函數(shù),總是先調(diào)用本類的成員函數(shù)(支配規(guī)則)。采用靜態(tài)聯(lián)編,調(diào)用A類的fun5();第九頁,共二十二頁,編輯于2023年,星期五構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用虛函數(shù)在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛函數(shù)時(shí),采用靜態(tài)聯(lián)編,即調(diào)用的虛函數(shù)是自己的類或基類中定義的函數(shù),不是任何在派生類中重定義的虛函數(shù)執(zhí)行Cc時(shí),先執(zhí)行B的基類A的構(gòu)造函數(shù),再執(zhí)行C的基類B的構(gòu)造函數(shù),最后調(diào)用C的構(gòu)造函數(shù)。B的構(gòu)造函數(shù)執(zhí)行func(),由于A類和C類中均有,應(yīng)執(zhí)行哪個(gè)?應(yīng)調(diào)用基類的虛函數(shù)執(zhí)行c.fun()時(shí),調(diào)用func(),因?yàn)槭荂對(duì)象產(chǎn)生的,故調(diào)用C的函數(shù)。第十頁,共二十二頁,編輯于2023年,星期五空的虛函數(shù)空虛函數(shù)為實(shí)現(xiàn)虛函數(shù)支配關(guān)系的不間斷。virtualvoidprintOn(){}第十一頁,共二十二頁,編輯于2023年,星期五純虛函數(shù)與抽象類基類中不能為虛函數(shù)給出一個(gè)有意義的定義,這時(shí)可將它說明為純虛函數(shù)。形式:class類名{virtual類型函數(shù)名(參數(shù)列表)=0;};第十二頁,共二十二頁,編輯于2023年,星期五說明:抽象類:至少包含有一個(gè)純虛函數(shù)的類,只能作為基類來派生新類,不能說明抽象類的對(duì)象。可以說明指向抽象類的指針(引用)從一個(gè)抽象類派生的類必須提供純虛函數(shù)的實(shí)現(xiàn)代碼,或在派生類中仍將它說明成純虛函數(shù)。在抽象類中也可定義普通成員函數(shù)或虛函數(shù),雖然不能為抽象類聲明對(duì)象,但可通過派生類對(duì)象來調(diào)用不是純虛函數(shù)的函數(shù)。在成員函數(shù)內(nèi)可以調(diào)用純虛函數(shù),但在構(gòu)造函數(shù)和析構(gòu)函數(shù)內(nèi)不能調(diào)用純虛函數(shù)與抽象類第十三頁,共二十二頁,編輯于2023年,星期五虛析構(gòu)函數(shù)只要基類的析構(gòu)函數(shù)被說明為虛函數(shù),則派生類的析構(gòu)函數(shù)自動(dòng)成為虛函數(shù)。而構(gòu)造函數(shù)的調(diào)用意味著建立一個(gè)對(duì)象,這時(shí)必須確切的知道這個(gè)對(duì)象的類型,因此無意義虛析構(gòu)函數(shù)的說明:
virtual~類名(){…}例:classA{ public: A(){} virtual~A(){cout<<“DestructorA”<<endl;}}; classB:publicA{ public: B(){} ~B(){cout<<“DestructorB”<<endl;}}; voidmain() {A*pa=newB; deletepa;}第十四頁,共二十二頁,編輯于2023年,星期五classpoint{floatx,y;public:voidsetPoint(floati,floatj){x=i;y=j;}virtualfloatarea(){return0.0;}};classcircle:publicpoint{floatradius;floatarea(){returnpi*radius*radius;}public:voidsetRadius(floatr){radius=r;}};voidmain(){circlec;c.setRadius(2.5);point&p=c;
floata=p.area();(floata=c.area();)cout<<"Theareaofthecircleis"<<a<<endl;}第十五頁,共二十二頁,編輯于2023年,星期五下列關(guān)于動(dòng)態(tài)聯(lián)編的描述中,錯(cuò)誤的是()
A)動(dòng)態(tài)聯(lián)編是以虛函數(shù)為基礎(chǔ)的
B)動(dòng)態(tài)聯(lián)編是在運(yùn)行時(shí)確定所調(diào)用的函數(shù)代碼的
C)動(dòng)態(tài)聯(lián)編調(diào)用函數(shù)操作是指向?qū)ο蟮闹羔樆驅(qū)ο笠?/p>
D)動(dòng)態(tài)聯(lián)編是在編譯時(shí)確定操作函數(shù)的關(guān)于虛函數(shù)的描述中,正確的是()
A)虛函數(shù)是一個(gè)靜態(tài)成員函數(shù)
B)虛函數(shù)是一個(gè)非成員函數(shù)
C)虛函數(shù)既可以在函數(shù)說明時(shí)定義,也可以在函數(shù)實(shí)現(xiàn)時(shí)定義
D)派生類的虛函數(shù)與基類中對(duì)應(yīng)的虛函數(shù)具有相同的參數(shù)個(gè)數(shù)和類型第十六頁,共二十二頁,編輯于2023年,星期五下面關(guān)于構(gòu)造函數(shù)和析構(gòu)函數(shù)的描述,錯(cuò)誤的是()
A)析構(gòu)函數(shù)中調(diào)用虛函數(shù)采用靜態(tài)聯(lián)編
B)對(duì)虛析構(gòu)函數(shù)的調(diào)用可以采用動(dòng)態(tài)聯(lián)編
C)當(dāng)基類的析構(gòu)函數(shù)是虛函數(shù)時(shí),其派生類的析構(gòu)函數(shù)也一定是虛函數(shù)
D)構(gòu)造函數(shù)可以聲明為虛函數(shù)關(guān)于純虛函數(shù)和抽象類的描述中,錯(cuò)誤的是()
A)純虛函數(shù)是一種特殊的虛函數(shù),它沒有具體的實(shí)現(xiàn)
B)抽象類是指具有純虛函數(shù)的類
C)一個(gè)基類中說明有純虛函數(shù),該基類的派生類一定不再是抽象類
D)抽象類只能作為基類來使用,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出第十七頁,共二十二頁,編輯于2023年,星期五以下()成員函數(shù)表示純虛函數(shù)A)virtualintvf(int); B)voidvf(int)=0;C)virtualvoidvf()=0; D)virtualvoidvf(int){}在下面程序中,A、B、C、D四句編譯時(shí)出現(xiàn)錯(cuò)誤的是classA//A{public://B A(){func();}//C virtualvoidfunc()=0;//D};第十八頁,共二十二頁,編輯于2023年,星期五下列程序的運(yùn)行結(jié)果如下:Basescons.Derivedscons.Derivedsdes.Basesdes.classBase{public: Base(){cout<<“Basescons.”<<endl;}
{cout<<“Basesdes.”<<endl;}};classDerived:publicBase{public: Derived(){cout<<“Derivedscons.”<<endl;} ~Derived(){cout<<“Derivedsdes.”<<endl;}};voidmain(){ Base*ptr=
deleteptr;}第十九頁,共二十二頁,編輯于2023年,星期五#include<iostream.h>classBase{public: virtualintfunc(){return0;}};classDerived:publicBase{public: intfunc(){return100;}};voidmain(){ Derivedd; Base&b=d; cout<<b.func()<<endl; cout<<b.Base::func()<<endl;}第二十頁,共二十二頁,編輯于2023年,星期五classbase1{public: virtualintfun(){cout<<“base1”<
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級(jí)語文上冊 第四單元 寫作 語言要連貫教學(xué)實(shí)錄 新人教版
- 2025年江蘇貨運(yùn)從業(yè)資格證科目一模擬考試題庫
- 流動(dòng)式吊車知識(shí)培訓(xùn)課件
- 四年級(jí)語文上冊 第四單元 13 精衛(wèi)填海教學(xué)實(shí)錄 新人教版五四制
- 撒哈拉以南非洲(第2課時(shí))課件-2024~2025學(xué)年人教版初中地理七年級(jí)下冊
- 第3課+中古時(shí)期的歐洲+高一下學(xué)期統(tǒng)編版(2019)必修中外歷史綱要下
- 陜西省咸陽市2023-2024學(xué)年高一(上)期末物理試卷【含解析】
- 部編版二年級(jí)語文下冊第3課《開滿鮮花的小路》精美課件
- 第2課《首屆諾貝爾獎(jiǎng)?lì)C發(fā)》教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版語文八年級(jí)上冊
- 北京市通州區(qū)2024-2025學(xué)年高一上學(xué)期1月期末物理試題(解析版)
- 電氣基礎(chǔ)知識(shí)培訓(xùn)要點(diǎn)課件
- 洗浴中心轉(zhuǎn)讓合同(5篇)
- 外研版小學(xué)英語五年級(jí)下冊課文翻譯
- YY-T 1823-2022 心血管植入物 鎳鈦合金鎳離子釋放試驗(yàn)方法
- 年產(chǎn)12000噸水合肼(100%)項(xiàng)目環(huán)評(píng)報(bào)告書
- 鉆芯法檢測混凝土抗壓強(qiáng)度原始記錄1
- 液壓支架與泵站(第二版)課件匯總?cè)珪娮咏贪竿暾嬲n件最全幻燈片(最新)
- 分布式光伏電站支架結(jié)構(gòu)及荷載計(jì)算書
- DB61∕T 1186-2018 花椒主要病蟲害防治技術(shù)規(guī)范
- DB32T 4013-2021 第三方社會(huì)穩(wěn)定風(fēng)險(xiǎn)評(píng)估技術(shù)規(guī)范
- QC成果提高大跨度多節(jié)點(diǎn)曲面鋼桁架一次安裝合格率
評(píng)論
0/150
提交評(píng)論