轉: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的析構函數。