第十講虛函數(shù)與多態(tài)性_第1頁
第十講虛函數(shù)與多態(tài)性_第2頁
第十講虛函數(shù)與多態(tài)性_第3頁
第十講虛函數(shù)與多態(tài)性_第4頁
第十講虛函數(shù)與多態(tài)性_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論