C++中,構(gòu)造函數(shù)不能設(shè)為虛函數(shù),基類析構(gòu)函數(shù)應(yīng)該設(shè)為虛函數(shù)

構(gòu)造函數(shù)不能聲明為虛函數(shù),析構(gòu)函數(shù)可以聲明為虛函數(shù),而且有時是必須聲明為虛函數(shù)。
不建議在構(gòu)造函數(shù)和析構(gòu)函數(shù)里面調(diào)用虛函數(shù)。
構(gòu)造函數(shù)不能申明為虛函數(shù),否則編譯器報錯,原因在于對象實例化是需要知道確切的類的類型,如果構(gòu)造函數(shù)為虛函數(shù)將不知道具體構(gòu)造基類函數(shù)還是繼承類函數(shù),所以構(gòu)造函數(shù)不能為虛函數(shù)。

基類的虛函數(shù)應(yīng)該設(shè)置為虛函數(shù),如果基類函數(shù)不為虛函數(shù),在用基類指針delete時,只會調(diào)用基類的虛構(gòu)函數(shù),而不會調(diào)用派生類的析構(gòu)函數(shù),導(dǎo)致派生類中的新的資源未被清理,造成內(nèi)存泄露。

舉個栗子:
<pre>

include <iostream>

using namespace std;
class Base{
public:
Base(){cout<<"Base"<<endl;};
Base(){cout<<"Base"<<endl;}
} ;
class A:public Base{
public:
A(){cout<<"A"<<endl;}
virtual A(){cout<<"A"<<endl;}
};
class B:public A
{
public:
B(){
cout<<"B"<<endl;
}
~B(){
cout<<"~B"<<endl;
}
};
int main()
{
Base *a=new B;
delete a;
return 0;
}
//輸出 //vs2013報debug錯誤,可能和編譯器有關(guān)
Base
A
B
~Base
</pre>
將~Base()聲明為virtual后,
//輸出
Base
A
B
~B
~A
~Base

結(jié)論:
因此在類的繼承體系中,基類的析構(gòu)函數(shù)不聲明為虛函數(shù)容易造成內(nèi)存泄漏。所以如果你設(shè)計一定類可能是基類的話,必須要聲明其為虛函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容