1. 程式人生 > 其它 >C++虛解構函式解析

C++虛解構函式解析

 當派生類物件從記憶體中撤銷時一般先執行派生類的解構函式,然後再呼叫基類的解構函式。

如果用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時執行解構函式。