天天看點

C++構造和析構函數設為虛函數

先說結論:

  • 構造函數不能設為虛函數;
  • 析構函數可以設為虛函數。

原因:

  • 虛函數的調用需要虛函數表指針,而該指針存放在對象的記憶體空間中;若構造函數聲明為虛函數,那麼由于對象還未建立,還沒有記憶體空間,更沒有虛函數表位址用來調用虛函數——構造函數了。相對來說,析構函數就可以設定為虛函數。

析構函數設為虛函數的作用:

  • 析構函數是為了在對象不被使用之後釋放它的資源,虛函數是為了實作多态,那麼把析構函數聲明為vitual有什麼作用?C++中基類采用virtual虛析構函數是為了防止記憶體洩漏。

    具體地說,如果派生類中申請了記憶體空間,并在其析構函數中對這些記憶體空間進行釋放。假設基類中采用的是非虛析構函數,當删除基類指針指向的派生類對象時就不會觸發動态綁定,因而隻會調用基類的析構函數,而不會調用派生類的析構函數。在這種情況下,派生類中申請的空間就得不到釋放進而産生記憶體洩漏。為了防止這種情況的發生,C++中基類的析構函數應采用virtual虛析構函數。

繼續閱讀