C 虛函式與純虛函式的區別

2021-07-04 21:31:21 字數 1983 閱讀 4593

什麼是虛函式?

那些被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 簡介 假設我們有下面的類層...