C++析構(gòu)函數(shù)加上virtual是為了防止內(nèi)存泄漏。
用在C++實(shí)現(xiàn)多態(tài)的時(shí)候,其基類要加virtual。
原因跟動(dòng)態(tài)綁定有關(guān),大家都知道,多態(tài)是通過虛函數(shù)實(shí)現(xiàn)的,而虛函數(shù)又是通過動(dòng)態(tài)綁定實(shí)現(xiàn)的。
先舉個(gè)例子:
class Base{ public: virtual void function() { cout<<"this is Base's function"<<endl; } virtual ~Base() { cout<<"this is Base's destroy"<<endl; }};class Derived:public Base{ public: void function() { cout<<"this is Derived's function"<<endl; } ~Derived() { cout<<"this is Derived's destroy"<<endl; }};int main(){ Base *ptr = new Derived(); ptr->function(); delete ptr; return 0;}上面的代碼,我先寫了虛函數(shù)function,第31行就是動(dòng)態(tài)綁定,而33行delete刪除的是Base型基類指針,此指針是沒有派生類Derived的析構(gòu)函數(shù)的,所以如果不在基類的析構(gòu)函數(shù)加上virtual的話,就不能動(dòng)態(tài)綁定派生類的析構(gòu)函數(shù)(當(dāng)然析構(gòu)函數(shù)的動(dòng)態(tài)綁定你可以看出來跟一般函數(shù)的動(dòng)態(tài)綁定相比是特殊的,析構(gòu)函數(shù)的虛函數(shù)不用按照函數(shù)名來找對(duì)應(yīng)的的函數(shù))。一句話:基類的析構(gòu)函數(shù)加了virtual就可以動(dòng)態(tài)綁定派生類的析構(gòu)函數(shù),這樣的話,在執(zhí)行多態(tài)后刪除其對(duì)象,就可以在刪除對(duì)象的時(shí)候執(zhí)行派生類的析構(gòu)函數(shù)了(當(dāng)然執(zhí)行基類的析構(gòu)函數(shù)是一定會(huì)的)。否則不會(huì)執(zhí)行派生類的析構(gòu)函數(shù)。代碼輸出結(jié)果:
this is Derived's function
this is Derived's destroy
this is Base's destroy
你可以嘗試一下把基類的析構(gòu)函數(shù)前的virtual刪掉(第9行),輸出結(jié)果將是:
this is Derived's function
this is Base's destroy
你可以觀察到,沒有執(zhí)行派生類的析構(gòu)函數(shù)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注