![C語(yǔ)言程序設(shè)計(jì)第15章多態(tài)性_第1頁(yè)](http://file4.renrendoc.com/view/fc92dd37e1fb4197cc14fb3950bdd2e9/fc92dd37e1fb4197cc14fb3950bdd2e91.gif)
![C語(yǔ)言程序設(shè)計(jì)第15章多態(tài)性_第2頁(yè)](http://file4.renrendoc.com/view/fc92dd37e1fb4197cc14fb3950bdd2e9/fc92dd37e1fb4197cc14fb3950bdd2e92.gif)
![C語(yǔ)言程序設(shè)計(jì)第15章多態(tài)性_第3頁(yè)](http://file4.renrendoc.com/view/fc92dd37e1fb4197cc14fb3950bdd2e9/fc92dd37e1fb4197cc14fb3950bdd2e93.gif)
![C語(yǔ)言程序設(shè)計(jì)第15章多態(tài)性_第4頁(yè)](http://file4.renrendoc.com/view/fc92dd37e1fb4197cc14fb3950bdd2e9/fc92dd37e1fb4197cc14fb3950bdd2e94.gif)
![C語(yǔ)言程序設(shè)計(jì)第15章多態(tài)性_第5頁(yè)](http://file4.renrendoc.com/view/fc92dd37e1fb4197cc14fb3950bdd2e9/fc92dd37e1fb4197cc14fb3950bdd2e95.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語(yǔ)言程序設(shè)計(jì)第15章多態(tài)性講授內(nèi)容靜態(tài)綁定和動(dòng)態(tài)綁定的概念多態(tài)性的意義和作用虛函數(shù)的定義方法抽象基類(lèi)的作用和定義方法虛析構(gòu)函數(shù)的作用和使用方法如何在程序中實(shí)現(xiàn)多態(tài)性15.1多態(tài)性的概念(1/5)多態(tài)性:具有繼承關(guān)系的類(lèi),其對(duì)象對(duì)同一個(gè)函數(shù)調(diào)用可以作出不同的響應(yīng)同一個(gè)函數(shù)調(diào)用——同一條函數(shù)調(diào)用語(yǔ)句不同的響應(yīng)——執(zhí)行不同的函數(shù)15.1多態(tài)性的概念(2/5)靜態(tài)綁定和動(dòng)態(tài)綁定靜態(tài)綁定——編譯時(shí)就能確定一條函數(shù)調(diào)用語(yǔ)句要調(diào)用的函數(shù)和面向?qū)ο蟮乃枷氩惶喾粭l指令對(duì)應(yīng)不同對(duì)象的不同操作——現(xiàn)實(shí)需要15.1多態(tài)性的概念(3/5)靜態(tài)綁定和動(dòng)態(tài)綁定動(dòng)態(tài)綁定:運(yùn)行時(shí)才能確定函數(shù)調(diào)用語(yǔ)句調(diào)用的函數(shù)調(diào)用對(duì)象的成員函數(shù)時(shí)(通過(guò)引用或指針),編譯器暫不確定要調(diào)用的函數(shù)編譯器檢查被調(diào)用函數(shù)是否存在(函數(shù)名、參數(shù)列表、返回值)程序運(yùn)行時(shí),系統(tǒng)根據(jù)接收消息的對(duì)象類(lèi)型來(lái)確定要調(diào)用的函數(shù)15.1多態(tài)性的概念(4/5)多態(tài)性的實(shí)現(xiàn)通過(guò)基類(lèi)指針或引用調(diào)用虛函數(shù)動(dòng)態(tài)綁定多態(tài)性有助于更好地對(duì)程序進(jìn)行抽象控制模塊能專(zhuān)注于一般性問(wèn)題的處理具體的操作交給具體的對(duì)象去做15.1多態(tài)性的概念(5/5)多態(tài)性有助于提高程序的可擴(kuò)展性可以把控制模塊與被操作的對(duì)象分開(kāi)可以添加已定義類(lèi)的新對(duì)象,并能管理該對(duì)象可以添加新類(lèi)(已有類(lèi)的派生類(lèi))的新對(duì)象,并能管理該對(duì)象常用的程序設(shè)計(jì)方法為具有繼承關(guān)系的類(lèi)定義接口(虛函數(shù))用鏈表或數(shù)組組織所有對(duì)象用基類(lèi)指針操作這些對(duì)象15.2虛函數(shù)虛函數(shù)的定義在函數(shù)原型前加上關(guān)鍵字virtual如果一個(gè)函數(shù)在基類(lèi)中被聲明為虛函數(shù),則他在所有派生類(lèi)中都是虛函數(shù)(包括重定義函數(shù))
virtualvoidshow();只有通過(guò)基類(lèi)指針或引用調(diào)用虛函數(shù)才能引發(fā)動(dòng)態(tài)綁定例子1:虛函數(shù)與多態(tài)性例子(1/3)//文件base.h//定義基類(lèi)#if!defined__BASE__H__#define__BASE__H__#include<iostream.h>
classBase{public:virtualvoidshow(){cout<<"IamBase'sobject!\n";}};
#endif例子1:虛函數(shù)與多態(tài)性例子(2/3)//文件derived.h//定義基類(lèi)Derived#if!defined__DERIVED__H__#define__DERIVED__H__#include"base.h"
classDerived:publicBase{public:voidshow(){cout<<"IamDerived'sobject!\n";}};
#endif例子1:虛函數(shù)與多態(tài)性例子(3/3)//文件ex15_2.cpp//測(cè)試多重繼承的類(lèi)層次#include"derived.h"main(){Base*bPtr,bObj;DeriveddObj;bPtr=&bObj; //基類(lèi)指針指向基類(lèi)對(duì)象
bPtr->show(); //用基類(lèi)指針調(diào)用成員函數(shù),動(dòng)態(tài)綁定
bPtr=&dObj; //基類(lèi)指針指向基類(lèi)對(duì)象
bPtr->show(); //用基類(lèi)指針調(diào)用成員函數(shù),動(dòng)態(tài)綁定
return0;}程序運(yùn)行如果IamBase'sobject!IamDerived'sobject!15.3抽象基類(lèi)和純虛函數(shù)(1/4)實(shí)現(xiàn)多態(tài)性的前提需要有共同的基類(lèi)需要在基類(lèi)中定義共同的接口接口要定義為虛函數(shù)如果基類(lèi)的接口沒(méi)辦法實(shí)現(xiàn)怎么辦?如形狀類(lèi)Shape15.3抽象基類(lèi)和純虛函數(shù)(2/4)解決方法不實(shí)現(xiàn)這些接口:純虛函數(shù)包含純虛函數(shù)的類(lèi):抽象基類(lèi)抽象基類(lèi)不能實(shí)例化對(duì)象形狀類(lèi)Shape的對(duì)象是什么?15.3抽象基類(lèi)和純虛函數(shù)(3/4)純虛函數(shù)沒(méi)有函數(shù)體的“初始化為0”的函數(shù)
//純虛函數(shù)virtualdoublearea()const=0;純虛函數(shù)不需要實(shí)現(xiàn)15.3抽象基類(lèi)和純虛函數(shù)(4/4)抽象類(lèi)和具體類(lèi)包含純虛函數(shù)的類(lèi)不能實(shí)例化對(duì)象,是抽象類(lèi)如果抽象類(lèi)的派生類(lèi)實(shí)現(xiàn)了所有基類(lèi)中的純虛函數(shù),則不再是抽象類(lèi)抽象類(lèi)存在的意義是作為其它類(lèi)的基類(lèi),也叫抽象基類(lèi)例子2:抽象基類(lèi)的例子(1/6)//文件shape.h//定義抽象基類(lèi)Shape#if!defined__SHAPE__H__#define__SHAPE__H__#include<iostream.h>
classShape{public:virtualdoublearea()const=0;virtualvoidshow()const=0;};
#endif例子2:抽象基類(lèi)的例子(2/6)//文件circle.h,定義派生類(lèi)Circle#if!defined__CIRCLE__H__#define__CIRCLE__H__#include"shape.h"#definePI3.1416classCircle:publicShape{public:
Circle(double=0.0,double=0.0,double=1.0);doublearea()const;voidshow()const;private:doublex,y;doubler;};#endif例子2:抽象基類(lèi)的例子(3/6)//文件circle.cpp,實(shí)現(xiàn)類(lèi)Circle#include"circle.h"Circle::Circle(doublea,doubleb,doublec){x=a;y=b;r=c;}doubleCircle::area()const{returnPI*r*r;}
voidCircle::show()const{cout<<"IamaCircle:";}例子2:抽象基類(lèi)的例子(4/6)//文件rectangle.h//定義派生類(lèi)Rectangle#if!defined__RECTANGLE__H__#define__RECTANGLE__H__#include"shape.h"classRectangle:publicShape{public:Rectangle(double=1.0,double=1.0);doublearea()const;voidshow()const;private:doublelength;doublewidth;};#endif例子2:抽象基類(lèi)的例子(5/6)//文件rectangle.cpp,實(shí)現(xiàn)類(lèi)Rectangle#include"rectangle.h"Rectangle::Rectangle(doublea,doubleb){length=a;width=b;}doubleRectangle::area()const{returnlength*width;}voidRectangle::show()const{cout<<"IamaRectangle:";}例子2:抽象基類(lèi)的例子(6/6)//文件ex15_3.cpp,測(cè)試類(lèi)Shape的層次結(jié)構(gòu)#include"circle.h"#include"rectangle.h"voidcallArea(Shape&);main(){Circlecir(0.0,0.0,2.5);Rectanglerec(2.4,5.3);callArea(cir);callArea(rec);return0;}voidcallArea(Shape&obj){obj.show();cout<<"area="<<obj.area()<<endl;}程序運(yùn)行結(jié)果IamaCircle:area=19.635IamaRectangle:area=12.7215.4虛析構(gòu)函數(shù)構(gòu)造函數(shù)的執(zhí)行順序:從上到下析構(gòu)函數(shù)的執(zhí)行順序:從下到上創(chuàng)建對(duì)象時(shí)要執(zhí)行正確的構(gòu)造函數(shù)撤銷(xiāo)對(duì)象時(shí)要執(zhí)行正確的析構(gòu)函數(shù)問(wèn)題:動(dòng)態(tài)對(duì)象的創(chuàng)建和撤銷(xiāo)15.4虛析構(gòu)函數(shù)動(dòng)態(tài)對(duì)象的創(chuàng)建動(dòng)態(tài)創(chuàng)建的對(duì)象沒(méi)有問(wèn)題
newClassName(…);ClassName指明了要調(diào)用的構(gòu)造函數(shù)動(dòng)態(tài)對(duì)象的撤銷(xiāo)
delete基類(lèi)指針;如果基類(lèi)指針指向的是派生類(lèi)的對(duì)象呢?15.4虛析構(gòu)函數(shù)析構(gòu)函數(shù)可以聲明為虛函數(shù)delete基類(lèi)指針;程序會(huì)根據(jù)基類(lèi)指針指向的對(duì)象的類(lèi)型確定要調(diào)用的析構(gòu)函數(shù)基類(lèi)的析構(gòu)函數(shù)為虛函數(shù),所有派生類(lèi)的析構(gòu)函數(shù)都是虛函數(shù)如果要操作具有繼承關(guān)系的類(lèi)的動(dòng)態(tài)對(duì)象,最好使用虛析構(gòu)函數(shù)例子3:虛析構(gòu)函數(shù)的例子//文件employee.h,定義基類(lèi)Employee#include<iostream.h>#if!defined__EMPLOYEE__H__#define__EMPLOYEE__H__classEmployee{public:Employee(){ cout<<"Employeebegin!"<<endl; }virtual~Employee(){cout<<"Employeeend!"<<endl;}};#endif例子3:虛析構(gòu)函數(shù)的例子//文件programmer.h,定義派生類(lèi)Programmer#include<iostream.h>#include<string.h>#include"employee.h"classProgrammer:publicEmployee{public:Programmer(char*str){cout<<"Programmerbegin!"<<endl;name=newchar[strlen(str)+1];strcpy(name,str);}~Programmer(){deletename;cout<<"Programmerend!"<<endl;}private:char*name;};例子3:虛析構(gòu)函數(shù)的例子//文件accountant.h,定義派生類(lèi)Accountant#include<iostream.h>#include"employee.h"classAccountant:publicEmployee{public:Accountant(intn){cout<<"Accountantbegin!"<<endl;age=n;}~Accountant(){cout<<"Accountantend!"<<endl;}private:intage;};例子3:虛析構(gòu)函數(shù)的例子//文件ex15_4.cpp#include"accountant.h"#include"programmer.h"constintMAX=100;main(){intno;//聲明儲(chǔ)存雇員信息的數(shù)組
Employee*ptr[MAX],*tptr;intENum=0;charname[100];intage;for(inti=0;i<MAX;i++){ptr[i]=NULL;}例子3:虛析構(gòu)函數(shù)的例子//輸入雇員信息
cout<<"Inputemployees'info:"<<endl;cout<<"1---Programmer"<<endl<<"2---Accountant"<<endl<<"0---exit"<<endl;cin>>no;while(no){switch(no){case1: //輸入程序員信息
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個(gè)人向個(gè)人借款合同簡(jiǎn)單版(三篇)
- 2025年上海市技術(shù)開(kāi)發(fā)合同樣本(三篇)
- 小微車(chē)租賃合同
- 2025中石油購(gòu)銷(xiāo)合同模板
- 2025年個(gè)人向企業(yè)借款合同格式范文(2篇)
- 商鋪門(mén)面轉(zhuǎn)讓合同
- 內(nèi)部調(diào)劑合同
- 2025前期物業(yè)服務(wù)合同廣東省湛江市版
- 2025年個(gè)人與鐘點(diǎn)工雇傭合同樣本(4篇)
- 外墻承包合同范本2
- 成人手術(shù)后疼痛評(píng)估與護(hù)理團(tuán)體標(biāo)準(zhǔn)
- zemax-優(yōu)化函數(shù)說(shuō)明書(shū)
- 2021年《民法典擔(dān)保制度司法解釋》適用解讀之擔(dān)保解釋的歷程
- 第02講 導(dǎo)數(shù)與函數(shù)的單調(diào)性(學(xué)生版)-2025版高中數(shù)學(xué)一輪復(fù)習(xí)考點(diǎn)幫
- 湖南財(cái)政經(jīng)濟(jì)學(xué)院《常微分方程》2023-2024學(xué)年第一學(xué)期期末試卷
- 游戲賬號(hào)借用合同模板
- 2022年中考英語(yǔ)語(yǔ)法-專(zhuān)題練習(xí)-名詞(含答案)
- 2011年公務(wù)員國(guó)考《申論》真題卷及答案(地市級(jí))
- 多元化評(píng)價(jià)體系構(gòu)建
- 商業(yè)模式的設(shè)計(jì)與創(chuàng)新課件
- AQ/T 4131-2023 煙花爆竹重大危險(xiǎn)源辨識(shí)(正式版)
評(píng)論
0/150
提交評(píng)論