1 C++類的對象構造的時候,首先申請一片內存,然後調用構造函數進行初始化;
我們知道,存在虛函數的話,也會存在一個虛函數表vtable,而虛函數表示在什麼時候產生的呢,當然是在調用構造函數之後產生的;
那麼問題來了,如果構造函數爲虛函數,此時的內存是一片空白,不存在該虛函數表vtable,那麼無法找到該構造函數;
所以說,構造函數不能爲虛函數。
2 此外,如果有以下代碼:
class A{ A() {} }; class B: public A{ B():A() {} }; int main(){ B b; B *pb = &b; }
則構造B類的時候,構造函數執行順序是:
A() B()
根據虛函數的性質,如果A的構造函數爲虛函數,且B類也給出了構造函數,則應該只執行B類的構造函數,不再執行A類的構造函數,這樣A就無法構造了,產生了矛盾;
因此,構造函數不能爲虛函數。
對於析構函數而言,可以爲虛函數,因爲此時虛函數表早已建立;並且,常常析構函數都是虛函數。原因就是,通過基類指針在銷燬對象的時候,可以正確的識別要銷燬對象的類型,從而防止析構不完全的出現。