1、作用:
在實現多型時,當用基類的指標操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。!!!!
2、例項:
#include
using
namespace
std;
class father
~father()//(1)非虛函式
private:
int *mptr;
};class son:public father
~son()
private:
long *mstr;
};int main()
結果:
father destruction......
process returned 0 (0x0) execution time : 0.023 s
press any key to continue.
從程式的執行結果來看,程式最後只釋放了父類的記憶體,子類的記憶體並沒有釋放。則這段程式產生了記憶體洩露。!!!那是什麼原因導致的呢?
在main函式中new出來的是子類son的物件,採用乙個父類father的指標來接收,故在析構的時候,編譯器因為只知道這個指標是父類的,所以只將父類部分的記憶體析構了,而不會去析構子類的記憶體,就造成了記憶體洩露,那麼如何避免這種情況的產生呢?
將父類的析構函式改為虛函式,就可以避免這種情況。!!!
只需將上例的(1)處非虛函式改為:
virtual ~father()
執行得到結果:
son destruction...
...father destruction...
...process returned 0 (0x0) execution time : 0.025 s
press any key to continue.
從程式的執行結果可以看出,父類和子類的記憶體都被析構了。所以在使用多型時一定要將父類的析構函式定義成虛函式,從而避免記憶體洩露。!!!
如果不需要基類對派生類及物件進行操作,則不能定義虛函式,因為這樣會增加記憶體開銷.當類裡面有定義虛函式的時候,編譯器會給類新增乙個虛函式表,裡面來存放虛函式指標,這樣就會增加類的儲存空間.所以,只有當乙個類被用來作為基類的時候,才把析構函式寫成虛函式.!!!
對於如下**,在(2)處,只是使用子類指標操作子類,則沒必要將基類析構函式定義為虛函式:
#include
using
namespace
std;
class father
~father()//(1)非虛函式
private:
int *mptr;
};class son:public father
~son()
private:
long *mstr;
};int main()
結果:
son destruction...
...father destruction...
...process returned 0 (0x0) execution time : 0.038 s
press any key to continue.
為什麼要將基類的析構函式宣告為虛函式
我們大家都知道,在c 中,當乙個物件銷毀時,析構函式是用來對類物件和物件成員進行釋放記憶體和做一些其他的cleanup操作。析構函式靠 符號來區分,出現在 析構函式名字的前面,當我們去定義乙個 虛析構函式時,你只需要簡單的的在 符號前面 加乙個 virtual標誌就可以了。為什麼需要將析構函式宣告為...
為什麼要將類的析構函式宣告為虛函式?
我們知道在類的繼承中,建構函式的執行順序是先構造基類然後再構造派生類,析構函式則相反,是先析構派生類再析構基類。我們也知道宣告父類的指標指向派生類,編譯器會預設實施靜態繫結,不能呼叫派生類重寫的函式,所以才需要虛函式。虛函式是通過虛函式表實現,在執行時進行動態繫結,可以呼叫在派生類重寫的函式。那麼如...
在C 的基類中,析構函式為什麼宣告為虛函式?
在c 的基類中,析構函式為什麼宣告為虛函式,如果不宣告為虛函式時,會發生什麼?奉上 include class base base class derive public base derive int main int argc,tchar argv 執行結果 base create derive...