什麼是虛函式?
那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性(polymorphism),多型性是將介面與實現進行分離;用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。
虛函式宣告如下:virtual returntype functionname(parameter);
虛函式必須實現,如果不實現,編譯器將報錯,錯誤提示為:
error lnk****: unresolved external symbol "public: virtual void __thiscall
classname::virtualfunctionname(void)"
為什麼要用純虛函式?
在很多情況下,基類
本身生成物件是不合情理的。例如,動物作為乙個基類
可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。為了解決這個問題,方便使用類的多型性,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。
在什麼情況下使用純虛函式(pure vitrual function)?
1,當想在基類中抽象出乙個方法,且該基類只做能被繼承,而不能被例項化;
2,這個方法必須在派生類(derived class)中被實現;
如果滿足以上兩點,可以考慮將該方法申明為pure virtual function.
我們來舉個例子,我們先定義乙個形狀的類(cshape),但凡是形狀我們都要求其能顯示自己。所以我們定義了乙個類如下:
class cshape;};
但沒有cshape這種形狀,因此我們不想讓cshape這個類被例項化,我們首先想到的是將show函式的定義(實現)部分刪除如下:
class cshape ;
當我們使用下面的語句例項化乙個cshape時:
cshape cs; //這是我們不允許的,但僅用上面的**是可以通過編譯(但link時失敗)。
怎麼樣避免乙個cshape被例項化,且在編譯時就被發現?
答案是:使用pure virtual funcion.
我們再次修改cshape類如下:
class cshape ;
這時在例項化cshape時就會有以下報錯資訊:
error c2259: 'cshape' : cannot instantiate abstract class due to following members:
warning c4259: 'void __thiscall cshape::show(void)' : pure virtual function was not defined
我們再來看看被繼承的情況,我們需要乙個cpoint2d的類,它繼承自cshape.他必須實現基類(cshape)中的show()方法。
其實使用最初的本意是讓每乙個派生自cshape的類,都要實現show()方法,但時常我們可能在乙個派生類中忘記了實現show(),為了避免這種情況,pure virtual funcion發揮作用了。
我們看以下**:
class cpoint2d:public cshape
;void msg();};
當我們例項化cpoint2d時,在編譯時(at the compiling)也會出現如下的報錯:
error c2259: 'cshape' : cannot instantiate abstract class due to following members:
warning c4259: 'void __thiscall cshape::show(void)' : pure virtual function was not defined
如上,我們預防了在派生類中忘記實現基類方法。
C 虛函式與純虛函式的區別
c 虛函式與純虛函式的區別 1.虛函式和純虛函式可以定義在同乙個類 class 中,含有純虛函式的類被稱為抽象類 abstract class 而只含有虛函式的類 class 不能被稱為抽象類 abstract class 2.虛函式可以被直接使用,也可以被子類 sub class 過載以後以多型的...
C 虛函式與純虛函式的區別
什麼是虛函式?那些被virtual關鍵字修飾的 成員函式 就是虛函式。虛函式的作用,用專業術語來解釋就是實現 多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。虛函式宣告如下 virtual returntype f...
虛函式 與 純虛函式 區別
首先 強調乙個概念 定義乙個函式為虛函式,不代表函式為不被實現的函式。定義他為虛函式是為了允許用基類的指標來呼叫子類的這個函式。定義乙個函式為純虛函式,才代表函式沒有被實現。定義純虛函式是為了實現乙個介面,起到乙個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。1 簡介 假設我們有下面的類層...