C++ Primter中講“在 C++ 中,基類必須指出希望派生類重寫哪些函數,定義為 virtual 的函數是基類期待派生類重新定義的,基類希望派生類繼承的函數不能定義為虛函數”。
析構函數是為了在對象不被使用之後釋放它的資源,虛函數是為了實現多態。那麼把析構函數聲明為vitual有什麼作用呢?,下面通過例子來說明一下vitual的用途。
using namespace std;
class Base
{
public:
Base() {}; //Base的構造函數
~Base() //Base的析構函數
{
cout << "the destructor of class Base!" << endl;
};
virtual void DoSomething()
{
cout << "Do something in class Base!" << endl;
};
};
class Derived : public Base
{
public:
Derived() {}; //Derived的構造函數
~Derived() //Derived的析構函數
{
cout << "the destructor of class Derived!" << endl;
};
void DoSomething()
{
cout << "Do something in class Derived!" << endl;
};
};
int main()
{
Derived *pTest1 = new Derived(); //Derived類的指針
pTest1->DoSomething();
delete pTest1;
cout << endl;
Base *pTest2 = new Derived(); //Base類的指針
pTest2->DoSomething();
delete pTest2;
return 0;
}
先看程序輸出結果:
1 Do something in class Derived!
2 the destructor of class Derived!
3 the destructor of class Base!
4
5 Do something in class Derived!
6 the destructor of class Base!
從運行結果來看,pTest1運行比較正常,也好理解,pTest2運行了子類的Do something和父類的析構函數,並沒有運行子類的析構函數,這樣會造成內存洩漏。
pTest2運行了子類的Do something量因為父類的Do something加了virtual。
pTest2運行了父類的析構函數是因為父類的析構函數並沒有加virtual,所以它並不會運行子類的析構函數。
如果Base的析構函數加上virtual,那麼pTest1和pTest2運行過程一樣。
總結:如果一個類有可能會被繼承,那麼它的析構函數最好加上virtual,不然出現內存洩漏問題找都找不到。