構造函數和析構函數可以是虛函數嗎


轉:https://www.cnblogs.com/ktao/p/7563289.html

1. 為什么構造函數不能為虛函數?

    虛函數的調用需要虛函數表指針,而該指針存放在對象的內存空間中;若構造函數聲明為虛函數,那么由於對象還未創建,還沒有內存空間,更沒有虛函數表地址用來調用虛函數——構造函數了。
 
2. 為什么析構函數可以為虛函數,如果不設為虛函數可能會存在什么問題?
    首先析構函數可以為虛函數,而且當要使用基類指針或引用調用子類時,最好將基類的析構函數聲明為虛函數,否則可以存在內存泄露的問題。
    舉例說明:
    子類B繼承自基類A; A *p = new B; delete p;
  1) 此時,如果類A的析構函數不是虛函數,那么delete p; 將會僅僅調用A的析構函數,只釋放了B對象中的A部分,而派生出的新的部分未釋放掉。
     2) 如果類A的析構函數是虛函數,delete p; 將會先調用B的析構函數,再調用A的析構函數,釋放B對象的所有空間。
    補充: B *p = new B; delete p;時也是先調用B的析構函數,再調用A的析構函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM