繼承和多型二 虛析構函式

2022-08-16 13:36:14 字數 1275 閱讀 9959

雖然我們已經知道了什麼是繼承和多型,也明白了多型依賴於繼承,但是在多型中存在哪些問題呢?

多型中可能存在的記憶體洩露問題

例如下面的程式中,在圓形circle的類中定義乙個圓心的座標,並且座標是在堆中申請的記憶體,則在mian函式中通過基類指標操作派生類物件的成員函式是沒有問題的,可是在銷毀物件記憶體的時候則只是執行了基類的析構函式,派生類的析構函式卻沒有執行,這會導致記憶體洩漏。換句話說如果delete後邊跟基類的指標則只會執行基類的析構函式,如果delete後面跟的是派生類的指標,那麼它即會執行派生類的析構函式,也會執行基類的析構函式

class

shape

//虛函式

shape();

~shape();

....

private

: ....

};shape::shape()

shape::~shape()

class circle:public

shape

;circle::circle(

int x,int y,double

r)circle::~circle()

....

intmain()

列印結果可見,派生類的析構函式並沒有被執行,而只是**了開闢給基類物件的空間,那如何解決這個問題呢,固然可以通過delete派生類物件實現,除此之外,還可以引入虛析構函式,你看普通的虛函式都可以實現多型的動態聯編,那對於析構函式呢?虛析構函式也會在最後物件銷毀記憶體時動態鏈結到派生類物件。

可以這樣解釋它:如果基類當中定義了虛析構函式,那麼基類的虛函式表當中就會有乙個基類的虛析構函式的入口指標,指向的是基類的虛析構函式,派生類的虛函式表當中也會產生乙個派生類的虛析構函式的入口指標,指向的是派生類的虛析構函式,這個時候使用基類的指標指向派生類的物件,delete掉基類指標,就會通過指向的基類的物件找到基類的虛函式表指標,從而找到虛函式表,在虛函式表中找到派生類的虛析構函式,從而使得派生類的析構函式得以執行,派生類的析構函式執行之後系統會自動執行父類的虛析構函式。即整個執行過程是:

基類的建構函式;

派生類的建構函式;

......

派生類的析構函式;

基類的析構函式。

virtual關鍵字可以修飾普通的成員函式,也可以修飾析構函式,但並不是沒有限制

virtual在函式中的使用限制

繼承(多型和虛析構函式)

派生類不能直接訪問基類的私有成員,必須通過基類方法進行訪問。建立派生類物件時,首先建立基類物件。也就是說基類物件在程式進入派生類建構函式之前被建立。c 使用成員初始化列表來完成。派生類建構函式初始化基類私有成員,採用成員初始化列表。總結 首先,若基類函式需要被派生類重定義,則需要將其在基類宣告為虛函...

虛函式和多型(析構函式)

描述 1.定義乙個類animal,該類中包含資料成員name用來記錄動物的名字,並有乙個虛函式show用於顯示動物的種類。2 定義兩個類cat和dog,都繼承自animal 包含show函式,不但要顯示動物的種類 型別分別 為 cat,dog 還要顯示動物的名字。3 定義乙個tiger類,繼承自ca...

繼承與多型(四) 虛析構函式

當指向派生物件的指標被delete時,如果基類的析構函式是虛函式 應該如此 將執行正確的操作 呼叫派生類析構,呼叫基類析構。class mammal virtual mammal 需要被繼承的基類,析構函式都應該設定為虛函式,否則有可能無法析構基類 virtual void speak const ...