C語言程序設計第15章多態(tài)性_第1頁
C語言程序設計第15章多態(tài)性_第2頁
C語言程序設計第15章多態(tài)性_第3頁
C語言程序設計第15章多態(tài)性_第4頁
C語言程序設計第15章多態(tài)性_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言程序設計第15章多態(tài)性講授內容靜態(tài)綁定和動態(tài)綁定的概念多態(tài)性的意義和作用虛函數的定義方法抽象基類的作用和定義方法虛析構函數的作用和使用方法如何在程序中實現多態(tài)性15.1多態(tài)性的概念(1/5)多態(tài)性:具有繼承關系的類,其對象對同一個函數調用可以作出不同的響應同一個函數調用——同一條函數調用語句不同的響應——執(zhí)行不同的函數15.1多態(tài)性的概念(2/5)靜態(tài)綁定和動態(tài)綁定靜態(tài)綁定——編譯時就能確定一條函數調用語句要調用的函數和面向對象的思想不太相符一條指令對應不同對象的不同操作——現實需要15.1多態(tài)性的概念(3/5)靜態(tài)綁定和動態(tài)綁定動態(tài)綁定:運行時才能確定函數調用語句調用的函數調用對象的成員函數時(通過引用或指針),編譯器暫不確定要調用的函數編譯器檢查被調用函數是否存在(函數名、參數列表、返回值)程序運行時,系統(tǒng)根據接收消息的對象類型來確定要調用的函數15.1多態(tài)性的概念(4/5)多態(tài)性的實現通過基類指針或引用調用虛函數動態(tài)綁定多態(tài)性有助于更好地對程序進行抽象控制模塊能專注于一般性問題的處理具體的操作交給具體的對象去做15.1多態(tài)性的概念(5/5)多態(tài)性有助于提高程序的可擴展性可以把控制模塊與被操作的對象分開可以添加已定義類的新對象,并能管理該對象可以添加新類(已有類的派生類)的新對象,并能管理該對象常用的程序設計方法為具有繼承關系的類定義接口(虛函數)用鏈表或數組組織所有對象用基類指針操作這些對象15.2虛函數虛函數的定義在函數原型前加上關鍵字virtual如果一個函數在基類中被聲明為虛函數,則他在所有派生類中都是虛函數(包括重定義函數)

virtualvoidshow();只有通過基類指針或引用調用虛函數才能引發(fā)動態(tài)綁定例子1:虛函數與多態(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:虛函數與多態(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:虛函數與多態(tài)性例子(3/3)//文件ex15_2.cpp//測試多重繼承的類層次#include"derived.h"main(){Base*bPtr,bObj;DeriveddObj;bPtr=&bObj; //基類指針指向基類對象

bPtr->show(); //用基類指針調用成員函數,動態(tài)綁定

bPtr=&dObj; //基類指針指向基類對象

bPtr->show(); //用基類指針調用成員函數,動態(tài)綁定

return0;}程序運行如果IamBase'sobject!IamDerived'sobject!15.3抽象基類和純虛函數(1/4)實現多態(tài)性的前提需要有共同的基類需要在基類中定義共同的接口接口要定義為虛函數如果基類的接口沒辦法實現怎么辦?如形狀類Shape15.3抽象基類和純虛函數(2/4)解決方法不實現這些接口:純虛函數包含純虛函數的類:抽象基類抽象基類不能實例化對象形狀類Shape的對象是什么?15.3抽象基類和純虛函數(3/4)純虛函數沒有函數體的“初始化為0”的函數

//純虛函數virtualdoublearea()const=0;純虛函數不需要實現15.3抽象基類和純虛函數(4/4)抽象類和具體類包含純虛函數的類不能實例化對象,是抽象類如果抽象類的派生類實現了所有基類中的純虛函數,則不再是抽象類抽象類存在的意義是作為其它類的基類,也叫抽象基類例子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,實現類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,實現類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,測試類Shape的層次結構#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;}程序運行結果IamaCircle:area=19.635IamaRectangle:area=12.7215.4虛析構函數構造函數的執(zhí)行順序:從上到下析構函數的執(zhí)行順序:從下到上創(chuàng)建對象時要執(zhí)行正確的構造函數撤銷對象時要執(zhí)行正確的析構函數問題:動態(tài)對象的創(chuàng)建和撤銷15.4虛析構函數動態(tài)對象的創(chuàng)建動態(tài)創(chuàng)建的對象沒有問題

newClassName(…);ClassName指明了要調用的構造函數動態(tài)對象的撤銷

delete基類指針;如果基類指針指向的是派生類的對象呢?15.4虛析構函數析構函數可以聲明為虛函數delete基類指針;程序會根據基類指針指向的對象的類型確定要調用的析構函數基類的析構函數為虛函數,所有派生類的析構函數都是虛函數如果要操作具有繼承關系的類的動態(tài)對象,最好使用虛析構函數例子3:虛析構函數的例子//文件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:虛析構函數的例子//文件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:虛析構函數的例子//文件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:虛析構函數的例子//文件ex15_4.cpp#include"accountant.h"#include"programmer.h"constintMAX=100;main(){intno;//聲明儲存雇員信息的數組

Employee*ptr[MAX],*tptr;intENum=0;charname[100];intage;for(inti=0;i<MAX;i++){ptr[i]=NULL;}例子3:虛析構函數的例子//輸入雇員信息

cout<<"Inputemployees'info:"<<endl;cout<<"1---Programmer"<<endl<<"2---Accountant"<<endl<<"0---exit"<<endl;cin>>no;while(no){switch(no){case1: //輸入程序員信息

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論