什麼情況下應當宣告虛函式?純虛函式宣告

2021-09-01 05:24:38 字數 1446 閱讀 3918

注意:

只能用virtual宣告類的成員函式,使之成為虛函式,不能將類外的普通函式宣告為虛函式。因為虛函式的作用是允許在派生類中對基類的虛函式重新定義。所以只能用於類的繼承層次結構中。

乙個成員函式被宣告為虛函式後,在同一類族中的類就不能再定義乙個非virtual的但與該虛函式具有相同的引數(包括個數和型別)和函式返回值型別的同名函式。

根據什麼考慮是否把乙個成員函式宣告為虛函式?

首先看成員函式所在的類是否會作為基類。然後看成員函式在類的繼承後有無可能被更改功能,如果希望更改其功能的,一般應該將它宣告為虛函式。

如果成員函式在類被繼承後功能不需修改,或派生類用不到該函式,則不要把它宣告為虛函式。不要僅僅考慮到作為基類而把類中的所有成員函式都宣告為虛函式。

應考試對成員函式的呼叫是通過物件名還是通過基類指標或引用去訪問,如果是通過基類指標或引用去訪問的,則應當宣告為虛函式。

有時在定義虛函式時,並不定義其函式體,即空函式。它的作用只是定義了乙個虛函式名,具體功能留給派生類去新增。

說明:使用虛函式,系統要有一定的空間開銷。當乙個類帶有虛函式時,編譯系統會為該類構造乙個虛函式表,它是乙個指標陣列,存放每個虛函式的入口位址。系統在進行動態關聯的時間開銷很少,提高了多型性的效率。

一、虛析構函式

析構函式的作用是在物件撤銷之前把類的物件從記憶體中撤銷。通常系統只會執行基類的析構函式,不執行派生類的析構函式。

只需要把基類的析構函式宣告為虛函式,即虛析構函式,這樣就會撤銷基類物件的同時撤銷派生類的物件了,這個過程是動態關聯完成的。

如果將基類的析構函式宣告為虛函式時,由該基類所派生的所有派生類的析構函式都自動成為虛函式,即使派生類的析構函式與基類的析構函式名字不相同。

最好把基類的析構函式宣告為虛函式。這將使所有派生類的析構函式自動成為虛函式,如果程式中顯式delete運算子刪除乙個物件,而操作物件用了指向派生類物件的基類指標,系統會呼叫相應類的析構函式。

建構函式不能宣告為虛函式。

一、純虛函式

有時候,基類中的虛函式是為了派生類中的使用而宣告定義的,其在基類中沒有任何意義。此類函式我們叫做純虛函式,不需要寫成空函式的形式,只需要宣告成:

virtual float area()const=0;的形式即可。

一般形式:virtual 函式型別 函式名(形參表列)=0;

注意:純虛函式沒有函式體;

最後面的「=0「並不代表函式返回值為0,只是形式上的作用,告訴編譯系統」這是純虛函式」;

這是乙個宣告語句,最後應有分號。

純虛函式只有函式的名字但不具備函式的功能,不能被呼叫。在派生類中對此函式提供定義後,才能具備函式的功能,可以被呼叫。

什麼情況下,類的析構函式宣告為虛函式

include using namespace std class clxbase clxbase void dosomething class clxderived public clxbase clxderived void dosomething int main 執行結果 do someth...

析構函式在什麼情況下應該宣告為虛函式

如標題所言,乙個c 物件的析構函式,在什麼情況下,應該被宣告為乙個虛函式呢?看到這一標題,我興趣大增。首先,虛析構函式是什麼意思呢?well,你想想,乙個類的虛方法是什麼意思,就能明白虛析構函式是怎麼一回事兒了。如果乙個方法被宣告為虛方法,則當呼叫這個方法時,會呼叫具體實現此方法的物件方法,也稱動態...

析構函式什麼情況下要定義為虛函式

1.第一段 include using namespace std class clxbase clxbase void dosomething class clxderived public clxbase clxderived void dosomething int main 執行結果 do ...