虛函數(shù)和純虛函數(shù)_第1頁
虛函數(shù)和純虛函數(shù)_第2頁
虛函數(shù)和純虛函數(shù)_第3頁
虛函數(shù)和純虛函數(shù)_第4頁
虛函數(shù)和純虛函數(shù)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、這個是C+內(nèi)容!虛函數(shù)和純虛函數(shù)不是一個東西!虛函數(shù)和純虛函數(shù)在面向?qū)ο蟮?C+語言中,虛函數(shù)(virtual fun ction )是一個非常重要的概念。因?yàn)樗?分體現(xiàn)了面向?qū)ο笏枷胫械睦^承和多態(tài)性這兩大特性,在C+語言里應(yīng)用極廣。比如在微軟的MFC類庫中,你會發(fā)現(xiàn)很多函數(shù)都有 virtual關(guān)鍵字,也就是說,它們都是虛函數(shù)。難 怪有人甚至稱虛函數(shù)是 C+語言的精髓。那么,什么是虛函數(shù)呢,我們先來看看微軟的解釋:虛函數(shù)是指一個類中你希望重載的成員函數(shù),當(dāng)你用一個基類指針或引用指向一個繼承類對象的時候,你調(diào)用一個虛函數(shù),實(shí)際調(diào)用的是繼承類的版本。摘自MSDN這個定義說得不是很明白。MSDN中

2、還給出了一個例子,但是它的例子也并不能很好的說明問題。我們自己編寫這樣一個例子:# i nelude "stdio.h"# i nclude "conio.h"class Pare ntpublic:char data20;void Fun cti on 1();virtual void Function2();/ 這里聲明 Function2 是虛函數(shù)pare nt;void Pare nt:F unction 1()prin tf("This is pare nt,fu nction1n");void Pare nt:F unct

3、ion 2()prin tf("This is pare nt,fu nctio n2n");class Child:public Parentvoid Fun cti on 1();void Fun cti on 2(); child;void Child:Fu nctio n1()prin tf("This is child,fu nctio n1n");void Child:Fu nctio n2()prin tf("This is child,fu nctio n2n");int main (i nt argc, char*

4、argv)Parent *p; II定義一個基類指針if(_getch()='c')II如果輸入一個小寫字母 celsep=&child;/指向繼承類對象p=&pare nt;/否則指向基類對象p-> Function 1();/這里在編譯時會直接給出Pare nt:Fu nctio n1()的入口地址。p-> Fun cti on 2();/注意這里,執(zhí)行的是哪一個Function2 ?return 0;編譯并運(yùn)行,輸入一個小寫字母c,得到用任意版本的 Visual C+或Borland C+F面的結(jié)果:This is pare nt,fu nct

5、i on1This is child,fu nctio n2為什么會有第一行的結(jié)果呢?因?yàn)槲覀兪怯靡粋€Pare nt類的指針調(diào)用函數(shù)Fuction1(),雖然實(shí)際上這個指針指向的是Child類的對象,但編譯器無法知道這一事實(shí)(直到運(yùn)行的時候,程序才可以根據(jù)用戶的輸入判斷出指針指向的對象),它只能按照調(diào)用Pare nt類的函數(shù)來理解并編譯,所以我們看到了第一行的結(jié)果。那么第二行的結(jié)果又是怎么回事呢?我們注意到,F(xiàn)unction2()函數(shù)在基類中被virtual關(guān)鍵字修飾,也就是說,它是一個虛函數(shù)。虛函數(shù)最關(guān)鍵的特點(diǎn)是動態(tài)聯(lián)編”,它可以在運(yùn)行時判斷指針指向的對象,并自動調(diào)用相應(yīng)的函數(shù)。如果我們在運(yùn)

6、行上面的程序時任意輸入一個非c的字符,結(jié)果如下:This is pare nt,fu ncti on1This is pare nt,fu ncti on2請注意看第二行,它的結(jié)果出現(xiàn)了變化。程序中僅僅調(diào)用了一個Function2()函數(shù),卻可以根據(jù)用戶的輸入自動決定到底調(diào)用基類中的Function2還是繼承類中的Function2 ,這就是虛函數(shù)的作用。我們知道,在MFC中,很多類都是需要你繼承的,它們的成員函數(shù)很多都要重載,比如編寫MFC應(yīng)用程序最常用的CView:OnDraw(CDC*)函數(shù),就必須重載使用。把它定義為虛函數(shù)(實(shí)際上,在MFC中OnDraw不僅是虛函數(shù),還是純虛函數(shù))可以

7、保證時刻調(diào)用的是用戶自己編寫的OnDraw。虛函數(shù)的重要用途在這里可見一斑。再看下面的上一篇:為何析構(gòu)函數(shù)中的 cout不起作用 下一篇:菱形虛擬繼承后,派生類的大小問題C+中虛函數(shù)和純虛函數(shù)的概念,差別和分別存在的原因摘自:C+中虛函數(shù)和純虛函數(shù)的概念,差別和分別存在的原因首先:強(qiáng)調(diào)一個概念定義一個函數(shù)為虛函數(shù),不代表函數(shù)為不被實(shí)現(xiàn)的函數(shù)定義他為虛函數(shù)是為了允許用基類的指針來調(diào)用子類的這個函數(shù)定義一個函數(shù)為純虛函數(shù),才代表函數(shù)沒有被實(shí)現(xiàn)定義他是為了實(shí)現(xiàn)一個接口,起到一個規(guī)范的作用,規(guī)范繼承這個 類的程序員必須實(shí)現(xiàn)這個函數(shù)。對繼承的影響:普通的類(沒有虛函數(shù),純虛函數(shù))就可以被繼承,而且工作的

8、相當(dāng)好關(guān)于這個問題有以下疑問:純虛函數(shù)難道就是為了實(shí)現(xiàn)接口?接口存在的意義?我實(shí)在弄不懂,我干嘛要預(yù)先定義好?未來的事情本難料就等有一天我的類中需要使用某個函數(shù),在添加一個函數(shù) 不久可以?關(guān)于實(shí)例化一個類:有純虛函數(shù)的類是不可能生成類對象的,如果沒有純虛函數(shù)則可以。比如:class CApublic:virtual voidfun()=0;/ 說明fun函數(shù)為純虛函數(shù)virtual void fun 1();;class CBpublic:virtualvoidfun();virtualvoidfun 1();/ CA , CB類的實(shí)現(xiàn)voidmai n()CA a;/不允許,因?yàn)轭?CA中有

9、純虛函數(shù)CB b;/可以,因?yàn)轭怌B中沒有純虛函數(shù)虛函數(shù)在多態(tài)中間的使用:多態(tài)一般就是通過指向基類的指針來實(shí)現(xiàn)的。dog mydogwa ngwa ng;mydogwa ngwa ng.bor n();一定是返回“ dog”那么horse myhorsepipi;myhorsepipi.bor n();一定是返回 “ horse ”也是多態(tài)呀?/有一點(diǎn)你必須明白,就是用父類的指針在運(yùn)行時刻來調(diào)用子類 例如,有個函數(shù)是這樣的:void ani mal:fu n1(a ni mal*maybedog_maybehorse)maybedog_maybehorse->bor n();參數(shù)mayb

10、edog_maybehorse在編譯時刻并不知道傳進(jìn)來的是dog類還是horse類,所以就把它設(shè)定為animal類,具體到運(yùn)行時決定了才決定用那個函數(shù)。也就是說用父類指針通過虛函數(shù)來決定運(yùn)行時刻到底是誰而指向誰的函數(shù)。/用虛函數(shù)#in elude<iostream.h>class ani malpublic:ani mal();ani mal();void fun 1(a ni mal*maybedog_maybehorse);virtual void born();voidani mal:fu n1(a ni mal*maybedog_maybehorse)maybedog_ma

11、ybehorse->bor n(); ani mal:a ni mal()an imal:a ni mal()voidani mal:bor n()cout<<"ani mal"class dog: public animalpublic:dog();dog();virtual void born();;dog:dog()dog:dog()voiddog:bor n()cout<<"dog"class horse:public animalpublic:horse();horse();virtual void born();

12、horse:horse()horse:horse()void horse:bor n()cout<<"horse"voidmai n()an imala;dog b;horse c;a.fu n1(&c);/output:horseIllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll不用虛函數(shù)#in elude <iostream.h>class ani malpublic:ani mal();ani mal();voidfun 1(a ni mal*maybedo

13、g_maybehorse);void born();voidani mal:fu n1(a ni mal*maybedog_maybehorse)maybedog_maybehorse->bor n(); ani mal:a ni mal()an imal:a ni mal()void ani mal:bor n()cout<< "ani mal"class dog: public animalpublic:dog();dog();void born();dog:dog()dog:dog()voiddog:bor n()cout<<"dog"class horse:public animalpublic:horse();horse();void born();horse:horse()horse:horse()voidhorse:bor n()cout<<"horse"void mai n()an imala;dog b;horse c;a.fu n1(&c);out

溫馨提示

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

最新文檔

評論

0/150

提交評論