構(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ù)。