在面嚮對象語言中,接口的多種不同的實現方式即爲多態。c++可以使用virtual來實現多態。
如果不使用virtual的話,C++對成員函數使用靜態聯編,而使用virtual,並且在調用函數時是通過指針或引用調用,C++則對成員函數進行動態編聯(也就是遲後綁定,運行的時候才確定調用哪個對象)。
關於virtual的用法比較簡單,不再複述,我們這次來看看virtual析構函數的作用。
1.示例
我們先來看一段代碼:
class A
{
public:
~A()
{
cout<<"~A()";
}
};
class A1 : public A{
public:
~A1()
{
cout<<"~A1()";
}
};
void main()
{
A* a = new A1();//基類指針接受子類對象
delete a;
return;
}
咋一看好像沒什麼問題,但運行一下你會發現輸出的結果是~A()。
也就是說只析構了基類的對象,沒有釋放子類的對象,造成局部銷燬這種詭異的資源泄漏問題。
消除這種問題的做法也很簡單,給基類添加一個virtual析構函數,此後刪除子類就會銷燬整個對象。
2.實現:
class A
{
public:
virtual ~A()
{
cout<<"~A()";
}
};
class A1 : public A{
public:
~A1()
{
cout<<"~A1()";
}
};
void main()
{
A* a = new A1();
delete a;
return;
}
加上virutal關鍵字後,運行結果:先是子類的析構~A1() 然後是基類的析構~A()。整個對象被銷燬,不存在局部銷燬問題。
一個比較好的判斷方式是:如果你的基類(base classes)設計是爲了多態用途,那麼它應該聲明一個virtual析構函數,如果classes帶有任何virtual函數,那麼它也應該有一個virtual析構函數。