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

下載本文檔

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

文檔簡介

C+ 在繼承中虛函數(shù)、純虛函數(shù)、普通函數(shù),三者的區(qū)別1.虛函數(shù)(impure virtual)C+的虛函數(shù)主要作用是“運(yùn)行時多態(tài)”,父類中提供虛函數(shù)的實現(xiàn),為子類提供默認(rèn)的函數(shù)實現(xiàn)。子類可以重寫父類的虛函數(shù)實現(xiàn)子類的特殊化。如下就是一個父類中的虛函數(shù):class Apublic: virtual void out2(string s) coutA(out2):sendl; ;2.純虛函數(shù)(pure virtual)C+中包含純虛函數(shù)的類,被稱為是“抽象類”。抽象類不能使用new出對象,只有實現(xiàn)了這個純虛函數(shù)的子類才能new出對象。C+中的純虛函數(shù)更像是“只提供申明,沒有實現(xiàn)”,是對子類的約束,是“接口繼承”。C+中的純虛函數(shù)也是一種“運(yùn)行時多態(tài)”。如下面的類包含純虛函數(shù),就是“抽象類”:class Apublic: virtual void out1(string s)=0; virtual void out2(string s) coutA(out2):sendl; ;3.普通函數(shù)(no-virtual)普通函數(shù)是靜態(tài)編譯的,沒有運(yùn)行時多態(tài),只會根據(jù)指針或引用的“字面值”類對象,調(diào)用自己的普通函數(shù)。普通函數(shù)是父類為子類提供的“強(qiáng)制實現(xiàn)”。因此,在繼承關(guān)系中,子類不應(yīng)該重寫父類的普通函數(shù),因為函數(shù)的調(diào)用至于類對象的字面值有關(guān)。4.程序綜合實例#include using namespace std;class Apublic: virtual void out1()=0; /由子類實現(xiàn) virtual A(); virtual void out2() /默認(rèn)實現(xiàn) coutA(out2)endl; void out3() /強(qiáng)制實現(xiàn) coutA(out3)endl; ;class B:public Apublic: virtual B(); void out1() coutB(out1)endl; void out2() coutB(out2)endl; void out3() coutB(out3)out1(); ab-out2(); ab-out3(); cout*out1(); bb-out2(); bb-out3(); delete ab; delete bb; return 0;C+虛函數(shù)與純虛函數(shù)用法與區(qū)別(轉(zhuǎn))1.虛函數(shù)和純虛函數(shù)可以定義在同一個類(class)中,含有純虛函數(shù)的類被稱為抽象類(abstractclass),而只含有虛函數(shù)的類(class)不能被稱為抽象類(abstractclass)。2.虛函數(shù)可以被直接使用,也可以被子類(subclass)重載以后以多態(tài)的形式調(diào)用,而純虛函數(shù)必須在子類(subclass)中實現(xiàn)該函數(shù)才可以使用,因為純虛函數(shù)在基類(baseclass)只有聲明而沒有定義。3.虛函數(shù)和純虛函數(shù)都可以在子類(subclass)中被重載,以多態(tài)的形式被調(diào)用。4.虛函數(shù)和純虛函數(shù)通常存在于抽象基類(abstractbaseclass-ABC)之中,被繼承的子類重載,目的是提供一個統(tǒng)一的接口。5.虛函數(shù)的定義形式:virtualmethodbody純虛函數(shù)的定義形式:virtual=0;在虛函數(shù)和純虛函數(shù)的定義中不能有static標(biāo)識符,原因很簡單,被static修飾的函數(shù)在編譯時候要求前期bind,然而虛函數(shù)卻是動態(tài)綁定(run-timebind),而且被兩者修飾的函數(shù)生命周期(liferecycle)也不一樣。6.虛函數(shù)必須實現(xiàn),如果不實現(xiàn),編譯器將報錯,錯誤提示為:errorLNK*:unresolvedexternalsymbolpublic:virtualvoid_thiscallClassName:virtualFunctionName(void)7.對于虛函數(shù)來說,父類和子類都有各自的版本。由多態(tài)方式調(diào)用的時候動態(tài)綁定。8.實現(xiàn)了純虛函數(shù)的子類,該純虛函數(shù)在子類中就編程了虛函數(shù),子類的子類即孫子類可以覆蓋該虛函數(shù),由多態(tài)方式調(diào)用的時候動態(tài)綁定。9.虛函數(shù)是C+中用于實現(xiàn)多態(tài)(polymorphism)的機(jī)制。核心理念就是通過基類訪問派生類定義的函數(shù)10.多態(tài)性指相同對象收到不同消息或不同對象收到相同消息時產(chǎn)生不同的實現(xiàn)動作。C+支持兩種多態(tài)性:編譯時多態(tài)性,運(yùn)行時多態(tài)性。a.編譯時多態(tài)性:通過重載函數(shù)實現(xiàn)b運(yùn)行時多態(tài)性:通過虛函數(shù)實現(xiàn)。11.如果一個類中含有純虛函數(shù),那么任何試圖對該類進(jìn)行實例化的語句都將導(dǎo)致錯誤的產(chǎn)生,因為抽象基類(ABC)是不能被直接調(diào)用的。必須被子類繼承重載以后,根據(jù)要求調(diào)用其子類的方法。C+虛函數(shù)與純虛函數(shù)用法與區(qū)別(轉(zhuǎn)) 1. 虛函數(shù)和純虛函數(shù)可以定義在同一個類(class)中,含有純虛函數(shù)的類被稱為抽象類(abstract class),而只含有虛函數(shù)的類(class)不能被稱為抽象類(abstract class)。2. 虛函數(shù)可以被直接使用,也可以被子類(sub class)重載以后以多態(tài)的形式調(diào)用,而純虛函數(shù)必須在子類(sub class)中實現(xiàn)該函數(shù)才可以使用,因為純虛函數(shù)在基類(base class)只有聲明而沒有定義。 3. 虛函數(shù)和純虛函數(shù)都可以在子類(sub class)中被重載,以多態(tài)的形式被調(diào)用。 4. 虛函數(shù)和純虛函數(shù)通常存在于抽象基類(abstract base class -ABC)之中,被繼承的子類重載,目的是提供一個統(tǒng)一的接口。 5. 虛函數(shù)的定義形式:virtual method body純虛函數(shù)的定義形式:virtual = 0;在虛函數(shù)和純虛函數(shù)的定義中不能有static標(biāo)識符,原因很簡單,被static修飾的函數(shù)在編譯時候要求前期bind,然而虛函數(shù)卻是動態(tài)綁定(run-time bind),而且被兩者修飾的函數(shù)生命周期(life recycle)也不一樣。 6. 虛函數(shù)必須實現(xiàn),如果不實現(xiàn),編譯器將報錯,錯誤提示為:error LNK*: unresolved external symbol public: virtual void _thiscallClassName:virtualFunctionName(void)7. 對于虛函數(shù)來說,父類和子類都有各自的版本。由多態(tài)方式調(diào)用的時候動態(tài)綁定。 8. 實現(xiàn)了純虛函數(shù)的子類,該純虛函數(shù)在子類中就編程了虛函數(shù),子類的子類即孫子類可以覆蓋該虛函數(shù),由多態(tài)方式調(diào)用的時候動態(tài)綁定。9. 虛函數(shù)是C+中用于實現(xiàn)多態(tài)(polymorphism)的機(jī)制。核心理念就是通過基類訪問派生類定義的函數(shù)10. 多態(tài)性指相同對象收到不同消息或不同對象收到相同消息時產(chǎn)生不同的實現(xiàn)動作。C+支持兩種多態(tài)性:編譯時多態(tài)性,運(yùn)行時多態(tài)性。a.編譯時多態(tài)性:通過重載函數(shù)實現(xiàn)b 運(yùn)行時多態(tài)性:通過虛函數(shù)實現(xiàn)。 11. 如果一個類中含有純虛函數(shù),那么任何試圖對該類進(jìn)行實例化的語句都將導(dǎo)致錯誤的產(chǎn)生,因為抽象基類(ABC)是不能被直接調(diào)用的。必須被子類繼承重載以后,根據(jù)要求調(diào)用其子類的方法。復(fù)制代碼 1 /father class 2 3 class Virtualbase 4 5 6 7 public: 8 9 virtual void Demon()= 0; /prue virtual function10 11 virtual void Base() coutthis is farther class;12 13 14 15 /sub class16 17 class SubVirtual :public Virtualbase18 19 20 21 public:22 23 void Demon() cout this is SubVirtual! 24 25 void Base() coutthis is subclass BaseDemon();42 43 inst-Base();44 45 / inst = new Virtualbase();46 47 / inst-Base()48 49 return ;50 51 本文章已收錄于: 虛函數(shù)為了重載和多態(tài)的需要,在基類中是有定義的,即便定義是空,所以子類中可以重寫也可以不寫基類中的此函數(shù)!純虛函數(shù)在基類中是沒有定義的,必須在子類中加以實現(xiàn),很像java中的接口函數(shù)!虛函數(shù)引入原因:為了方便使用多態(tài)特性,我們常常需要在基類中定義虛函數(shù)。class Cmanpublic:virtual void Eat();void Move();private:;class CChild : public CManpublic:virtual void Eat();private:;CMan m_man;CChild m_child;CMan *p ;/這才是使用的精髓,如果不定義基類的指針去使用,沒有太大的意義p = &m_man ;p-Eat(); /始終調(diào)用CMan的Eat成員函數(shù),不會調(diào)用 CChild 的p = &m_child;p-Eat(); /如果子類實現(xiàn)(覆蓋)了該方法,則始終調(diào)用CChild的Eat函數(shù)/不會調(diào)用CMan 的 Eat 方法;如果子類沒有實現(xiàn)該函數(shù),則調(diào)用CMan的Eat函數(shù)p-Move(); /子類中沒有該成員函數(shù),所以調(diào)用的是基類中的純虛函數(shù)引入原因:1、同“虛函數(shù)”;2、在很多情況下,基類本身生成對象是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成對象明顯不合常理。純虛函數(shù)就是基類只定義了函數(shù)體,沒有實現(xiàn)過程,定義方法如: virtual void Eat() = 0; 不要 在cpp中定義;純虛函數(shù)相當(dāng)于接口,不能直接實例話,需要派生類來實現(xiàn)函數(shù)定義;有的人可能在想,定義這些有什么用啊 ,我覺得很有用,比如你想描述一些事物的屬性給別人,而自己不想去實現(xiàn),就可以定義為純虛函數(shù)。說的再透徹一些。比如蓋樓房,你是老板,你給建筑公司描述清楚你的樓房的特性,多少層,樓頂要有個花園什么的,建筑公司就可以按照你的方法去實現(xiàn)了,如果你不說清楚這些,可能建筑公司不太了解你需要樓房的特性。用純需函數(shù)就可以很好的分工合作了虛函數(shù)和純虛函數(shù)區(qū)別觀點一:類里聲明為虛函數(shù)的話,這個函數(shù)是實現(xiàn)的,哪怕是空實現(xiàn),它的作用就是為了能讓這個函數(shù)在它的子類里面可以被重載,這樣的話,這樣編譯器就可以使用后期綁定來達(dá)到多態(tài)了純虛函數(shù)只是一個接口,是個函數(shù)的聲明而已,它要留到子類里去實現(xiàn)。class Aprotected:void foo();/普通類函數(shù)virtual void foo1();/虛函數(shù)virtual void foo2() = 0;/純虛函數(shù)觀點二:虛函數(shù)在子類里面也可以不重載的;但純虛必須在子類去實現(xiàn),這就像Java的接口一樣。通常我們把很多函數(shù)加上virtual,是一個好的習(xí)慣,雖然犧牲了一些性能,但是增加了面向?qū)ο蟮亩鄳B(tài)性,

溫馨提示

  • 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

提交評論