構(gòu)造函數(shù)不能聲明為虛函數(shù),析構(gòu)函數(shù)可以聲明為虛函數(shù)壤巷,而且有時(shí)是必須聲明為虛函數(shù)邑彪。
不建議在構(gòu)造函數(shù)和析構(gòu)函數(shù)里面調(diào)用虛函數(shù)。
構(gòu)造函數(shù)不能申明為虛函數(shù)胧华,否則編譯器報(bào)錯(cuò)寄症,原因在于對(duì)象實(shí)例化是需要知道確切的類的類型,如果構(gòu)造函數(shù)為虛函數(shù)將不知道具體構(gòu)造基類函數(shù)還是繼承類函數(shù)矩动,所以構(gòu)造函數(shù)不能為虛函數(shù)有巧。
基類的虛函數(shù)應(yīng)該設(shè)置為虛函數(shù),如果基類函數(shù)不為虛函數(shù)悲没,在用基類指針delete時(shí)篮迎,只會(huì)調(diào)用基類的虛構(gòu)函數(shù),而不會(huì)調(diào)用派生類的析構(gòu)函數(shù)示姿,導(dǎo)致派生類中的新的資源未被清理甜橱,造成內(nèi)存泄露。
舉個(gè)栗子:
<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報(bào)debug錯(cuò)誤栈戳,可能和編譯器有關(guān)
Base
A
B
~Base
</pre>
將~Base()聲明為virtual后岂傲,
//輸出
Base
A
B
~B
~A
~Base
結(jié)論:
因此在類的繼承體系中,基類的析構(gòu)函數(shù)不聲明為虛函數(shù)容易造成內(nèi)存泄漏子檀。所以如果你設(shè)計(jì)一定類可能是基類的話镊掖,必須要聲明其為虛函數(shù)乃戈。