爲什麼基類中的析構函數要聲明爲虛析構函數?

題目

爲什麼基類中的析構函數要聲明爲虛析構函數?

解答

用對象指針來調用一個函數,有以下兩種情況:

  1. 如果是虛函數,會調用派生類中的版本。
  2. 如果是非虛函數,會調用指針所指類型的實現版本。

析構函數也會遵循以上兩種情況,因爲析構函數也是函數嘛,不要把它看得太特殊。 當對象出了作用域或是我們刪除對象指針,析構函數就會被調用。

當派生類對象出了作用域,派生類的析構函數會先調用,然後再調用它父類的析構函數, 這樣能保證分配給對象的內存得到正確釋放。

但是,如果我們刪除一個指向派生類對象的基類指針,而基類析構函數又是非虛的話, 那麼就會先調用基類的析構函數(上面第2種情況),派生類的析構函數得不到調用。

請看例子:

 

輸出是:

如果我們把基類的析構函數聲明爲虛析構函數,這會使得所有派生類的析構函數也爲虛。 從而使析構函數得到正確調用。

將基類的析構函數聲明爲虛的之後,得到的輸出是:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章