C 虛構函式的使用

2021-08-06 06:18:59 字數 1795 閱讀 8743

[cpp]view plain

copy

#include 

using

namespace

std;  

class

father  

~father();  

class

son:

public

father  

~son();  

void

main()    

在main函式中如上**所示,我們用乙個父指標指向子類物件,然後用delete釋放掉。這樣會造成記憶體洩露嗎?書上說,由於父指標指向了子物件,如果父類析構函式不宣告為虛函式,那麼,delete時,只會呼叫父類析構函式,不會呼叫子類析構函式。那麼,可能造成記憶體洩露。上面的**編譯執行後發現,確實,子類析構函式並沒有被呼叫。但會不會造成記憶體洩露呢?實踐是檢驗真理的唯一標準,我把main函式裡的**改為:

[cpp]view plain

copy

system(

"pause"

);  

father *p = new

son[1000000];  

delete

p;  

system("pause"

);  

執行發現,記憶體並沒有洩露。那為什麼書上說可能洩露呢,注意,「可能!」。我把**改為:

[cpp]view plain

copy

#include 

using

namespace

std;  

class

father  

~father()  

inta;  

};  

class

son:

public

father  

~son()  

int*b;  

};  

void

main()    

執行後發現,記憶體洩露了!為什麼呢?注意我們在子類建構函式了new了乙個int,本來我們需要用子類析構函式來delete的,但是由於main函式裡delete p時只呼叫了父類析構函式,沒有呼叫子類析構函式,所以子類析構函式裡的delete沒有執行,就記憶體洩露了。我們把上面**改一改,在父類析構函式前加個virtual宣告為虛函式。

[cpp]view plain

copy

#include 

using

namespace

std;  

class

father  

virtual

~father()  

inta;  

};  

class

son:

public

father  

~son()  

int*b;  

};  

void

main()    

執行發現,並沒有發生記憶體洩露!原來是這樣,書上說的可能發生記憶體洩露,「可能」,注意是「可能」。當子類析構函式裡有delete時,由於析構函式不是虛函式,main函式裡的父指標指向的是子類物件,delete父指標時只呼叫了父類析構函式而沒有呼叫子類析構函式,子類析構函式中的delete沒有被執行,所以就記憶體洩露了。但析構函式宣告為虛函式後,delete父指標時,既呼叫了子類析構函式也呼叫了父類析構函式。子類析構函式中的delete被執行,就沒有發生記憶體洩露。

c 虛構函式

c 語言為我們提供了一種語法結構,通過它可以指明乙個 虛函式只是提供了乙個 可被子型別改寫的介面。但是,它本身並不能通過虛擬機制被呼叫,這就是純虛函式 pure virtual function 純虛函式是在 基類中宣告的虛函式,它在基類中沒有定義,但要求任何 派生類都要定義自己的實現方法。在基類中...

C 中的「有返回值」的「虛」建構函式

c 如何會有 虛建構函式 而且還有返回值?有時我們希望類建構函式能夠像其它普通成員函式一樣使用 帶返回值,可覆蓋 override 我們可以設計這樣乙個 constructor 函式 我們在 lb 類中定義了這樣乙個 帶返回值的虛建構函式 在派生類中,我們可以覆蓋 override 它。現在我們可以...

虛建構函式和虛析構函式

1.析構函式可以為虛函式,且基類的析構函式一般均為虛函式。原因在於 通過基類指標delete base 時,可以通過虛的析構函式來釋放掉派生類獨自占用的記憶體,避免資源洩露。2.建構函式不可為虛函式。原因在於 建構函式是在物件完全構造之前執行的,在建構函式執行的時候,物件的動態型別還不完整。構造乙個...