虛函數純虛函數普通函數.docx_第1頁
虛函數純虛函數普通函數.docx_第2頁
虛函數純虛函數普通函數.docx_第3頁
虛函數純虛函數普通函數.docx_第4頁
虛函數純虛函數普通函數.docx_第5頁
已閱讀5頁,還剩7頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論