虛函式 純虛函式 虛函式與析構函式

2022-07-05 01:27:12 字數 1745 閱讀 2757

一、虛函式

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

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

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

①  看成員函式所在的類是否會作為基類

② 看成員函式在類的繼承後有無可能被更改功能,如果希望更改其功能的,一般應該將它宣告為虛函式。

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

應考慮對成員函式的呼叫是通過物件名還是通過基類指標或引用去訪問,如果是通過基類指標或引用去訪問的,則應當宣告為虛函式。有時在定義虛函式時,並不定義其函式體,即純虛函式。它的作用只是定義了乙個虛函式名,具體功能留給派生類去新增。

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

二、純虛函式

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

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

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

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

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

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

三、虛析構函式

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

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

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

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

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

例如:

#include using namespace std;

class animal

; virtual ~animal()

virtual void eat()

virtual void walk()

/* data */

};class dog : public animal

virtual ~dog()

int weight;

int height;

void eat()

(c++ 析構函式一般定義為虛函式)如果基類中析構函式沒有定義為虛函式,則delete ani的時候,僅僅呼叫了父類的析構函式,子類的沒有呼叫,如果在父類和子類的建構函式中都有動態記憶體分配,那麼就會存在記憶體洩漏的問題。一般析構函式最好都寫成虛函式,尤其是父類。 

虛函式 純虛函式 普通函式 虛析構函式

虛函式 純虛函式 普通函式 虛析構函式 其他 靜態成員函式實現隱藏,當前檔案可見,出了這個檔案就不可見了,所以多個檔案可以定義相同的名字。出了作用域之後不銷毀,程式結束才銷毀。靜態成員函式不屬於物件,它與任何物件都是無關的,因此靜態成員函式沒有this指標。也就是說 非靜態成員函式有this指標,而...

C 虛函式,純虛函式,虛析構和純虛析構

c 虛函式 定義為虛函式是為了允許用基類的指標來呼叫子類的這個函式,是需要具體實現的 virtual void funtion1 c 純虛函式 一 定義 純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 vir...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...