C++虛解構函式解析
阿新 • • 發佈:2022-05-03
當派生類物件從記憶體中撤銷時一般先執行派生類的解構函式,然後再呼叫基類的解構函式。
如果用new運算子建立的派生類的臨時物件,對指向基類的指標指向這個臨時物件當用delete運算子撤銷物件時,系統執行的是基類的解構函式,而不是派生類的解構函式,不能徹底的“清理現場”。解決的方法是將基類及派生類的解構函式設為虛擬函式,這時無論基類指標指向哪個派生類物件,系統會採用動態關聯,呼叫相應的解構函式對物件進行清理。
class Point { public : Point(){}; ~Point(){ std::cout << "Point destructor" << std::endl; } private : }; class Circle: public Point { public : Circle(){}; ~Circle(){ std::cout << "Circle destructor" << std::endl; }; private : }; int _tmain( int argc , _TCHAR* argv[]) { Point *p = new Circle; delete p; getchar(); return 0; }
程式執行結果如下:
下面將基類的解構函式改成虛解構函式
virtual ~Point(){ std::cout << "Point destructor" << std::endl; }
其它的不變,再執行:
這樣就達到我們的目的了,基類,派生類都呼叫了解構函式,另外需要注意的是
在基類的解構函式宣告為虛擬函式時,由該基類派生的解構函式也自動成為虛擬函式,即使派生類的解構函式與基類的解構函式名字不相同。
程式中顯示的用delete運算子刪除一個物件,而這個物件是指向派生類物件的基類指標,系統呼叫相應派生類的解構函式。
如果程式中的區域性物件離開其作用域,系統會隱式地呼叫其解構函式
咱們增加一個函式並從寫main函式:
Point *fc()
{
Circle cl;
Point *p = new Circle;
return p;
}
int _tmain( int argc , _TCHAR* argv[])
{
Point *q = fc();
delete q;
getchar();
return 0;
}
執行結果如下:
在上例中,函式非常fc的內部定義了兩個物件:c1和p所指向的Circle類物件。物件cl在函式fc結束時執行Circle的解構函式,撤銷區域性變數c1.p所指向的物件的地址通過函式返回值賦予q,q所指向的物件在執行delete時執行解構函式。