C語(yǔ)言8虛函數(shù)_第1頁(yè)
C語(yǔ)言8虛函數(shù)_第2頁(yè)
C語(yǔ)言8虛函數(shù)_第3頁(yè)
C語(yǔ)言8虛函數(shù)_第4頁(yè)
C語(yǔ)言8虛函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第八章第八章 虛函數(shù)虛函數(shù) C+中的動(dòng)態(tài)聯(lián)編是通過虛函數(shù)實(shí)現(xiàn)的,虛函數(shù)允許函數(shù)調(diào)用與函數(shù)體之間的聯(lián)系在運(yùn)行時(shí)才建立。8.1 引入派生類后的對(duì)象指針引入派生類后的對(duì)象指針指向基類的指針可以指向其公有派生類對(duì)象指向基類的指針可以指向其公有派生類對(duì)象 根據(jù)繼承方式的概念,按公有繼承的方式產(chǎn)生的派生類中,必然包含了原來基類中的全部成員。因此,一個(gè)公有派生類的對(duì)象可以提供其基類對(duì)象的全部行為,則在程序中可以把一個(gè)公有派生類對(duì)象當(dāng)作其基類對(duì)象來處理,那么,指向基類的指針自然也可以指向其公有派生類對(duì)象?!纠俊纠炕愔羔?、派生類指針、基類對(duì)象和派生類對(duì)象四者間組合的使用情況示例基類指針、派生類指針、基類對(duì)

2、象和派生類對(duì)象四者間組合的使用情況示例#include class A int a; public: A(int i=1) a=i; void print( ) couta=aendl; int geta( ) return a;class B:public A int b; public: B(int j=2) b=j; void print( ) coutb=bprint(); pb=&bb; pb-print(); pa=&bb; pa-print(); bb.print(); coutgeta()getb();則錯(cuò)誤,因基類則錯(cuò)誤,因基類指針僅能看到派生類中的基類部分,

3、指針僅能看到派生類中的基類部分,而不能直接訪問公有派生類中定義而不能直接訪問公有派生類中定義的成員,但可采用強(qiáng)制類型轉(zhuǎn)換的成員,但可采用強(qiáng)制類型轉(zhuǎn)換(B*)pa)-getb();結(jié)果結(jié)果:a=10b=20a=1b=201 /基類指針可以指向基類對(duì)象基類指針可以指向基類對(duì)象/派生指針可以指向派生類對(duì)象派生指針可以指向派生類對(duì)象/基類指針可指向它的公有派生類對(duì)象,但不許指向它的私有派生類對(duì)象。基類指針可指向它的公有派生類對(duì)象,但不許指向它的私有派生類對(duì)象。/錯(cuò)誤,派生類指針不可以直接指向基類對(duì)象錯(cuò)誤,派生類指針不可以直接指向基類對(duì)象8.2 虛函數(shù)的定義及使用虛函數(shù)的定義及使用1 1虛函數(shù)的作用虛函

4、數(shù)的作用 上例中,雖然基類指針pa指向派生類對(duì)象bb(即pa=&bb),但語(yǔ)句pa-print()所調(diào)用的函數(shù)仍是基類對(duì)象的print()。這是由于雖然一個(gè)基類指針可以指向其派生類對(duì)象,但指針本身的屬性并沒有改變,因此,系統(tǒng)認(rèn)為它所指向的仍然是一個(gè)基類對(duì)象,于是就只能調(diào)用其基類的成員函數(shù)print()。但在派生類中已經(jīng)改變了這個(gè)函數(shù)的實(shí)現(xiàn),即在派生類中又定義了一個(gè)同名的print()函數(shù),而這種改變?cè)陟o態(tài)聯(lián)編時(shí)編譯器并不知道,以致于造成和我們期望的結(jié)果不統(tǒng)一。 所以,必須通知編譯器這種可能的改變,即需要進(jìn)行動(dòng)態(tài)聯(lián)編,其方法就是在基類中將可能發(fā)生改變的成員函數(shù)聲明為虛函數(shù)。否則,若要調(diào)用

5、派生類中的成員函數(shù)print(),只能采用顯式的方法:bb.print(); 或采用對(duì)指針強(qiáng)制類型轉(zhuǎn)換的方法(B*)pa)-print(); 基類用虛函數(shù)提供了一個(gè)派生類對(duì)象都具有的共同界面,派生類又各自對(duì)虛函數(shù)定義自己的具體實(shí)現(xiàn),即常說的“同一接口,多種方法”。這樣,使得程序既簡(jiǎn)潔又具有擴(kuò)充性,并能幫助程序員處理越來越復(fù)雜的程序。2 2虛函數(shù)的定義虛函數(shù)的定義 在基類中的成員函數(shù)原型前加上關(guān)鍵字virtual,其格式如下:class class 類名類名 virtual virtual 類型類型 函數(shù)名(參數(shù)表);函數(shù)名(參數(shù)表); ; ; 當(dāng)一個(gè)類的成員函數(shù)說明為虛函數(shù)后,就可以在該類的(

6、直接或間接)派生類中定義與其基類虛函數(shù)原型相同的函數(shù)。這時(shí),當(dāng)用基類指針指向這些派生類對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)用派生類中的同名函數(shù)來代替基類中的虛函數(shù)。也就是說,當(dāng)用基類指針指向不同派生類對(duì)象時(shí),系統(tǒng)會(huì)在程序運(yùn)行中根據(jù)所指向?qū)ο蟮牟煌?,自?dòng)選擇適當(dāng)?shù)暮瘮?shù),從而實(shí)現(xiàn)了運(yùn)行時(shí)的多態(tài)性?!纠俊纠刻摵瘮?shù)的定義與應(yīng)用舉例。虛函數(shù)的定義與應(yīng)用舉例。#include “iostream.h”class Base public: virtual void show() cout”base classn”; ;class Der1: public Base public: void show() cout”der

7、ived class 1 n”; ;class Der2: public Base public: void show() coutshow(); p=&dobj1; p-show(); p=&dobj2; p-show(); 程序的運(yùn)行結(jié)果:程序的運(yùn)行結(jié)果:base classderived class 1derived class 2說明:說明:(1)在基類中,用virtual可將其public或protected成員函數(shù)聲明為虛函數(shù)。(2)在派生類中對(duì)基類聲明的虛函數(shù)進(jìn)行重新定義時(shí),virtual可寫可不寫。(3)虛函數(shù)被重新定義時(shí),其函數(shù)原型必須與基類中的函數(shù)原型完全相

8、同,包括函數(shù)名、返回類型、參數(shù)個(gè)數(shù)和參數(shù)類型的順序。(4)通過虛函數(shù)實(shí)現(xiàn)了運(yùn)行時(shí)的多態(tài)性。(5)只有通過基類指針訪問虛函數(shù)時(shí),才能獲得運(yùn)行時(shí)的多態(tài)性,使用對(duì)象名對(duì)象名.虛函數(shù)名虛函數(shù)名( )的方式時(shí),虛函數(shù)的調(diào)用是通過靜態(tài)聯(lián)編實(shí)現(xiàn)的。(6)當(dāng)一個(gè)函數(shù)在基類被聲明為虛函數(shù)后,不管經(jīng)歷多少層派生,都將保持其虛擬性。 (7)只有類的成員函數(shù)才能聲明為虛函數(shù),全局函數(shù)及靜態(tài)成員函數(shù)不能聲明為虛函數(shù)。(8)構(gòu)造函數(shù)不能是虛函數(shù),但析構(gòu)函數(shù)可以是虛函數(shù)。3虛函數(shù)與重載函數(shù)的關(guān)系虛函數(shù)與重載函數(shù)的關(guān)系 虛函數(shù)可以在一個(gè)或多個(gè)派生類中被重新定義,因此,屬于函數(shù)重載的情況,但這種重載與一般的函數(shù)重載是不同的。

9、例:class Base public: virtual void fun1( ); virtual void fun2( ); virtual void fun3( ); void fun4( );class Derived: public Base public: void fun1( ); /是虛函數(shù)是虛函數(shù) void fun2(int i ); /作為普通函數(shù)重載,虛特性消失作為普通函數(shù)重載,虛特性消失 char fun3( ); /錯(cuò)誤,因?yàn)橹挥蟹祷仡愋筒煌?,?yīng)刪去錯(cuò)誤,因?yàn)橹挥蟹祷仡愋筒煌?,?yīng)刪去 void fun4( ); /普通函數(shù)重載普通函數(shù)重載;void main() Ba

10、se *bp; Derived d; bp=&d; bp-fun1( ); /調(diào)用調(diào)用Derived:fun1( ) bp-fun2( ); /調(diào)用調(diào)用Base:fun2( ) bp-fun4( ); /調(diào)用調(diào)用Base:fun4( )4多重繼承與虛函數(shù)多重繼承與虛函數(shù)class Base1 public: virtual void fun( );class Base2 public: void fun( );class Derived: public Base1, public Base2 public: void fun( );void main() Base1 *p1; Base

11、2 *p2; Derived d; p1=&d; p1-fun( ); /調(diào)用調(diào)用derived:fun( ) p2=&d; p2-fun( ); /調(diào)用調(diào)用Base2:fun( )8.3 純虛函數(shù)與抽象類純虛函數(shù)與抽象類 純虛函數(shù)純虛函數(shù)是在基類中只聲明虛函數(shù)而不給出具體的函數(shù)定義體,將它的具體定義放在各派生類中,稱此虛函數(shù)為純虛函數(shù)。 純虛函數(shù)的聲明如下:(注:要放在基類的定義體中) virtual virtual 函數(shù)原型函數(shù)原型=0=0; 其中:函數(shù)原型的格式同前面所學(xué)格式一樣,要包括函數(shù)返回值的類型、函數(shù)名、圓括號(hào)、形參及其類型等。 聲明了純虛函數(shù)的類,稱為抽象類抽象

12、類。使用純虛函數(shù)時(shí)應(yīng)注意:使用純虛函數(shù)時(shí)應(yīng)注意:(1)抽象類中可以有多個(gè)純虛函數(shù)。(2)抽象類中也可以定義其他非純虛函數(shù)。(3)不能聲明抽象類的對(duì)象,但可以聲明指向抽象類的指針變量和引用變量。并且抽象類不能用做參數(shù)類型、函數(shù)返回值或顯式轉(zhuǎn)換的類型。(4)如果派生類中沒有重新定義基類中的純虛函數(shù),只是繼承它,則此派生類仍是一個(gè)抽象類。(5)從抽象類可以派生出具體或抽象類,但不能從具體類派生出抽象類。(6)在一個(gè)復(fù)雜的類繼承結(jié)構(gòu)中,越上層的類抽象程度越高,有時(shí)甚至無法給出某些成員函數(shù)的實(shí)現(xiàn),顯然,抽象類是一種特殊的類,它一般處于類繼承結(jié)構(gòu)的較上層。(7)引入抽象類的目的,主要是為了能將相關(guān)類組織在一個(gè)類繼承結(jié)構(gòu)中,并通過抽象類來為這些相關(guān)類提供統(tǒng)一的操作接口?!纠俊纠吭O(shè)計(jì)一個(gè)抽象類shape,它表示具有形狀的東西,體現(xiàn)了抽象的概念,在它下面可以派生出多種具體形狀,比如三角形、矩形。 #includeclass Shape protected: double x,y; public: void set(double i, double j) x=i; y=j; virtual void area()=0; /聲明純虛函數(shù)聲明純虛函數(shù) ;class Triangle: public Shape public: void area()

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論