版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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ù)的定義方法抽象基類的作用和定義方法虛析構(gòu)函數(shù)的作用和使用方法如何在程序中實(shí)現(xiàn)多態(tài)性15.1多態(tài)性的概念(1/5)多態(tài)性:具有繼承關(guān)系的類,其對(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)確定要調(diào)用的函數(shù)15.1多態(tài)性的概念(4/5)多態(tài)性的實(shí)現(xiàn)通過(guò)基類指針或引用調(diào)用虛函數(shù)動(dòng)態(tài)綁定多態(tài)性有助于更好地對(duì)程序進(jìn)行抽象控制模塊能專注于一般性問(wèn)題的處理具體的操作交給具體的對(duì)象去做15.1多態(tài)性的概念(5/5)多態(tài)性有助于提高程序的可擴(kuò)展性可以把控制模塊與被操作的對(duì)象分開(kāi)可以添加已定義類的新對(duì)象,并能管理該對(duì)象可以添加新類(已有類的派生類)的新對(duì)象,并能管理該對(duì)象常用的程序設(shè)計(jì)方法為具有繼承關(guān)系的類定義接口(虛函數(shù))用鏈表或數(shù)組組織所有對(duì)象用基類指針操作這些對(duì)象15.2虛函數(shù)虛函數(shù)的定義在函數(shù)原型前加上關(guān)鍵字virtual如果一個(gè)函數(shù)在基類中被聲明為虛函數(shù),則他在所有派生類中都是虛函數(shù)(包括重定義函數(shù))
virtualvoidshow();只有通過(guò)基類指針或引用調(diào)用虛函數(shù)才能引發(fā)動(dòng)態(tài)綁定例子1:虛函數(shù)與多態(tài)性例子(1/3)//文件base.h//定義基類#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//定義基類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è)試多重繼承的類層次#include"derived.h"main(){Base*bPtr,bObj;DeriveddObj;bPtr=&bObj; //基類指針指向基類對(duì)象
bPtr->show(); //用基類指針調(diào)用成員函數(shù),動(dòng)態(tài)綁定
bPtr=&dObj; //基類指針指向基類對(duì)象
bPtr->show(); //用基類指針調(diào)用成員函數(shù),動(dòng)態(tài)綁定
return0;}程序運(yùn)行如果IamBase'sobject!IamDerived'sobject!15.3抽象基類和純虛函數(shù)(1/4)實(shí)現(xiàn)多態(tài)性的前提需要有共同的基類需要在基類中定義共同的接口接口要定義為虛函數(shù)如果基類的接口沒(méi)辦法實(shí)現(xiàn)怎么辦?如形狀類Shape15.3抽象基類和純虛函數(shù)(2/4)解決方法不實(shí)現(xiàn)這些接口:純虛函數(shù)包含純虛函數(shù)的類:抽象基類抽象基類不能實(shí)例化對(duì)象形狀類Shape的對(duì)象是什么?15.3抽象基類和純虛函數(shù)(3/4)純虛函數(shù)沒(méi)有函數(shù)體的“初始化為0”的函數(shù)
//純虛函數(shù)virtualdoublearea()const=0;純虛函數(shù)不需要實(shí)現(xiàn)15.3抽象基類和純虛函數(shù)(4/4)抽象類和具體類包含純虛函數(shù)的類不能實(shí)例化對(duì)象,是抽象類如果抽象類的派生類實(shí)現(xiàn)了所有基類中的純虛函數(shù),則不再是抽象類抽象類存在的意義是作為其它類的基類,也叫抽象基類例子2:抽象基類的例子(1/6)//文件shape.h//定義抽象基類Shape#if!defined__SHAPE__H__#define__SHAPE__H__#include<iostream.h>
classShape{public:virtualdoublearea()const=0;virtualvoidshow()const=0;};
#endif例子2:抽象基類的例子(2/6)//文件circle.h,定義派生類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:抽象基類的例子(3/6)//文件circle.cpp,實(shí)現(xiàn)類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:抽象基類的例子(4/6)//文件rectangle.h//定義派生類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:抽象基類的例子(5/6)//文件rectangle.cpp,實(shí)現(xiàn)類Rectangle#include"rectangle.h"Rectangle::Rectangle(doublea,doubleb){length=a;width=b;}doubleRectangle::area()const{returnlength*width;}voidRectangle::show()const{cout<<"IamaRectangle:";}例子2:抽象基類的例子(6/6)//文件ex15_3.cpp,測(cè)試類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ù)撤銷對(duì)象時(shí)要執(zhí)行正確的析構(gòu)函數(shù)問(wèn)題:動(dòng)態(tài)對(duì)象的創(chuàng)建和撤銷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ì)象的撤銷
delete基類指針;如果基類指針指向的是派生類的對(duì)象呢?15.4虛析構(gòu)函數(shù)析構(gòu)函數(shù)可以聲明為虛函數(shù)delete基類指針;程序會(huì)根據(jù)基類指針指向的對(duì)象的類型確定要調(diào)用的析構(gòu)函數(shù)基類的析構(gòu)函數(shù)為虛函數(shù),所有派生類的析構(gòu)函數(shù)都是虛函數(shù)如果要操作具有繼承關(guān)系的類的動(dòng)態(tài)對(duì)象,最好使用虛析構(gòu)函數(shù)例子3:虛析構(gòu)函數(shù)的例子//文件employee.h,定義基類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,定義派生類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,定義派生類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)益歸上傳用戶所有。
- 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ì)用戶上傳內(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年廣東廣州市港務(wù)局直屬事業(yè)單位引進(jìn)短缺專業(yè)人才9人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年中圖版高一化學(xué)下冊(cè)階段測(cè)試試卷
- 二零二五版辦公室租賃附帶會(huì)議室租賃合同3篇
- 建筑用絕緣電工套管產(chǎn)品質(zhì)量監(jiān)督抽查實(shí)施細(xì)則
- 2024年菏澤家政職業(yè)學(xué)院高職單招數(shù)學(xué)歷年參考題庫(kù)含答案解析
- 2025年中圖版七年級(jí)化學(xué)下冊(cè)階段測(cè)試試卷含答案
- 《數(shù)控機(jī)床故障維修》課程標(biāo)準(zhǔn)
- 臨時(shí)消防工程承包協(xié)議2024年版范例版A版
- 2024版勞務(wù)協(xié)議2篇
- 2025年上教版七年級(jí)科學(xué)上冊(cè)月考試卷含答案
- 2024體育活動(dòng)區(qū)鋪沙子(合同)協(xié)議
- 《中華人民共和國(guó)機(jī)動(dòng)車駕駛?cè)丝颇恳豢荚囶}庫(kù)》
- 2024年VB程序設(shè)計(jì):從入門到精通
- 2024年故宮文化展覽計(jì)劃:課件創(chuàng)意與呈現(xiàn)
- 公共交通乘客投訴管理制度
- 不銹鋼伸縮縫安裝施工合同
- 水土保持監(jiān)理總結(jié)報(bào)告
- Android移動(dòng)開(kāi)發(fā)基礎(chǔ)案例教程(第2版)完整全套教學(xué)課件
- 醫(yī)保DRGDIP付費(fèi)基礎(chǔ)知識(shí)醫(yī)院內(nèi)培訓(xùn)課件
- 專題12 工藝流程綜合題- 三年(2022-2024)高考化學(xué)真題分類匯編(全國(guó)版)
- DB32T-經(jīng)成人中心靜脈通路裝置采血技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論