版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第十講虛函數(shù)與多態(tài)性1第一頁,共二十二頁,編輯于2023年,星期一
第十講虛函數(shù)與多態(tài)性
8.1多態(tài)的概念
8.2虛函數(shù)§8.1多態(tài)的概念第二頁,共二十二頁,編輯于2023年,星期一§8.1多態(tài)的概念什么是多態(tài)性
指在一般類中定義的操作在被繼承類繼承后可以有不同的表現(xiàn)形式。例如:圖形的求面積類:shape操作:求面積類:橢圓操作:求面積類:長方形操作:求面積解決的方法:用虛函數(shù)實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編第三頁,共二十二頁,編輯于2023年,星期一§8.1多態(tài)的概念例1:沒有用多態(tài)性的例題#include<iostream.h>classA{public:voidprint(){cout<<"A";}};
classB:publicA{//定義派生類
public:voidprint(){cout<<“B”;}};//重新定義函數(shù)voidmain()
{Aa,*p;Bb;p=&a;p->print();//訪問基類函數(shù)
p=&b;p->print();//希望訪問派生類函數(shù)
}結(jié)果:AA第四頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)虛函數(shù)的定義方法在基類中,在要被定義成虛函數(shù)的函數(shù)前加關(guān)鍵字virtual例如:virtualvoidprint();注意:1.關(guān)鍵字是virtual2.放在最前面,函數(shù)的類型不能忘,如virtualvoidprint():中的void3.可只在基類中的函數(shù)加virtual,在派生類中不加,
但為了便于閱讀,可在所有要聲明為虛函數(shù)的前面都加virtual4.只需要在類定義文件,即頭文件中的虛函數(shù)加
virtual,在cpp文件中就不要再加virtual第五頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)例2:用多態(tài)性解決例1中的問題#include<iostream.h>classbase{public:virtualvoidprint(){cout<<“base”;}};
//定義了虛函數(shù)classfirst:publicbase{
//定義派生類
public:voidprint(){cout<<“first”;}};//重新定義print()
classsecond:publicbase{//定義派生類
public:voidprint(){cout<<"second";}};//重新定義print()
第六頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)voidmain(){baseob1,*p;//定義基類的對象
firstob2;//定義派生類的對象
secondob3;//定義派生類的對象
p=&ob1;//p指向基類對象ob1
p->print();//調(diào)基類成員函數(shù)
p=&ob2;//p指向子類對象ob2p->print();//動(dòng)態(tài)聯(lián)編,調(diào)子類成員函數(shù)
p=&ob3;//p指向子類對象ob3p->print();//動(dòng)態(tài)聯(lián)編,調(diào)子類成員函數(shù)
}結(jié)果:basefirstsecond第七頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)例2的相關(guān)內(nèi)容總結(jié)1.基類中的虛函數(shù)是由virtual定義的:virtualvoidprint();2.在定義了虛函數(shù)之后,只要定義一個(gè)基類的指針,就可以調(diào)用子類的函數(shù):p=&ob2;//p指向子類對象ob2p->print();//動(dòng)態(tài)聯(lián)編,調(diào)子類成員函數(shù)3.要實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編,子類中的函數(shù)必需與基類的函數(shù)形式一致,若在子類中對虛函數(shù)的形式進(jìn)行了改變,則子類中的函數(shù)將失去多態(tài)性(詳細(xì)見下例)第八頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)例3.虛函數(shù)重載討論#include<iostream.h>classbase{public:virtualvoidf1(){cout<<"f1functionofbase\n";}//定義虛函數(shù)
virtualvoidf2(){cout<<"f2functionofbase\n";}//定義虛函數(shù)
voidf3(){cout<<"f3functionofbase\n";}//定義一般虛函數(shù)
};
classderive:publicbase{public:voidf1(){cout<<"f1functionofderive\n";}//重新定義虛函數(shù)
voidf2(intx){cout<<"f2functionofderive\n";}//重新定義虛函數(shù),
//由于形式改變,失去
//虛函數(shù)功能
voidf3(){cout<<"f3functionofderive\n";}//重新定義一般函數(shù)};
第九頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)voidmain(){baseob1,*p;//定義基類對象
deriveob2;//定義派生類對象
p=&ob1;p->f1();//調(diào)基類函數(shù)
p->f2();//調(diào)基類函數(shù)
p->f3();//調(diào)基類函數(shù)
p=&ob2;p->f1();//調(diào)子類函數(shù),多態(tài)性
p->f2();//調(diào)基類函數(shù),由于f2的形式改變
p->f3();//調(diào)基類函數(shù),由于沒有定義為虛函數(shù)}結(jié)果:f1functionofbasef2functionofbasef3functionofbasef1functionofderivef2functionofbasef3functionofbase第十頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)例3的相關(guān)內(nèi)容總結(jié)1.在定義了虛函數(shù)之后,只要定義一個(gè)基類的指針,就可以調(diào)用子類的函數(shù):p=&ob2;//p指向子類對象ob2p->f1();//動(dòng)態(tài)聯(lián)編,調(diào)子類成員函數(shù)2.若在子類中對虛函數(shù)的形式進(jìn)行了改變,則子類中的函數(shù)將失去多態(tài)性:p=&ob2;p->f2();//調(diào)基類函數(shù),而非派生類函數(shù)(由于f2形式改變)3.若基類中的函數(shù)沒有聲明為虛函數(shù),則子類中的函數(shù)不具有多態(tài)性:p=&ob2;p->f3();//調(diào)基類函數(shù)第十一頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)例4.多繼承虛函數(shù)作用討論base,有虛函數(shù)bddrive,有多態(tài)性derive,有多態(tài)性bbderive:base對象調(diào)用:有多態(tài)性base1對象調(diào)用:無多態(tài)性base1,無虛函數(shù)第十二頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)#include<iostream.h>classbase{//定義基類basepublic:virtualvoidf(){cout<<"base\n";}};
//定義虛函數(shù)classderive:publicbase{//定義base的派生類
public:voidf(){cout<<"derive\n";}};
//重新定義虛函數(shù)classbase1{//定義基類base1public:voidf(){cout<<"base1\n";}};
//定義一般函數(shù)classbdderive:publicderive{//定義派生類derive的派生類bdderivepublic:voidf(){cout<<"bdderive\n";}};
//重新定義虛函數(shù)classbbderive:
publicbase,
publicbase1
{//定義激類base和base1的派生類
public:voidf(){cout<<"bbderive\n";}};
第十三頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)voidmain()
{baseb,*p;//定義基類base的對象
base1*p1;//定義基類base1的對象
bdderivebd;//定義派生類bdderive
的對象
bbderivebb;//定義派生類bbderive
的對象
p=&b;p->f();//調(diào)base基類函數(shù)
p=&bb;p->f();//調(diào)子類函數(shù),多態(tài)性
p1=&bb;p1->f();//調(diào)base1基類函數(shù),無多態(tài)性
p=&bd;p->f();//調(diào)子類函數(shù),多態(tài)性
}結(jié)果:base
bbderive
base1bddrive第十四頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)例4的相關(guān)內(nèi)容總結(jié)1.在定義了虛函數(shù)之后,其多態(tài)性在派生類中得到延伸。2.在多重繼承中,若某一基類無虛函數(shù)定義,則由該基類創(chuàng)建的對象不具有多態(tài)性:base1*p;//基類
base1中沒有定義
f()為虛函數(shù)
p=&bb;p->f();//調(diào)基類函數(shù),無多態(tài)性第十五頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)例5.多態(tài)性的應(yīng)用:考慮哺乳動(dòng)物類mammal,它有派生類狗dog和貓cat,基類中有虛函數(shù)speak(),類層次如下圖。哺乳動(dòng)物mammal:虛函數(shù)speak()貓:speak():多態(tài)狗:speak():多態(tài)第十六頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)//基類和派生類定義classmammal{public:
virtualvoidspeak(){cout<<"Mammalspeak.\n";}};classdog:publicmammal{public:voidspeak(){cout<<"Woof!\n";}};classcat:publicmammal{public:voidspeak(){cout<<"Meow!\n";}};第十七頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)voidmain(){mammal*p;//定義基類對象的指針
intchoice;
do{
//循環(huán)體
cout<<"enteryourchoice";cout<<"(0:exit,1:cat,2:dog):";cin>>choice;switch(choice){
case1:p=newcat;break;case2:p=newdog;break;
default:p=newmammal;}p->speak();}while(choice!=0);//循環(huán)體結(jié)束}第十八頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)結(jié)果:enteryourchoice(0:exit,1:cat,2:dog):1Meow!
enteryourchoice(0:exit,1:cat,2:dog):2Woof!
enteryourchoice(0:exit,1:cat,2:dog):1Meow!
enteryourchoice(0:exit,1:cat,2:dog):3
Mammalspeak!enteryourchoice(0:exit,1:cat,2:dog):0Pressanykeytocontinue第十九頁,共二十二頁,編輯于2023年,星期一§8.2虛函數(shù)例5的相關(guān)內(nèi)容總結(jié)1.動(dòng)態(tài)聯(lián)編的體現(xiàn),在程序中
p->speak();
在編譯時(shí)不知道要調(diào)用哪一個(gè)speak()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高空施工安全責(zé)任書范本(二零二五年度)3篇
- 2025年度個(gè)人意外傷害保險(xiǎn)合同范本(二零二五版)4篇
- 二零二五版美甲店員工離職交接合同4篇
- 建筑資質(zhì)維護(hù)勞務(wù)協(xié)議書(2篇)
- 工廠用臨時(shí)工合同范本(2篇)
- 物業(yè)公司2025年度學(xué)校門衛(wèi)保養(yǎng)維護(hù)合同3篇
- 鋁合金百葉施工方案
- 臨戰(zhàn)水平封堵施工方案
- 二零二五版白灰礦產(chǎn)資源開采合同協(xié)議書3篇
- 2024年浙江省無人機(jī)應(yīng)用技能競賽備考試題庫(含各題型)
- 勞務(wù)協(xié)議范本模板
- 2025大巴車租車合同范文
- 人教版(2024)數(shù)學(xué)七年級(jí)上冊期末測試卷(含答案)
- 2024年國家保密培訓(xùn)
- 2024年公務(wù)員職務(wù)任命書3篇
- CFM56-3發(fā)動(dòng)機(jī)構(gòu)造課件
- 會(huì)議讀書交流分享匯報(bào)課件-《殺死一只知更鳥》
- 2025屆撫州市高一上數(shù)學(xué)期末綜合測試試題含解析
- 公司印章管理登記使用臺(tái)賬表
- 磚廠承包合同簽訂轉(zhuǎn)讓合同
- 2023年公務(wù)員多省聯(lián)考《申論》題(廣西B卷)
評論
0/150
提交評論