C++類的構造函數不能爲虛函數的原因

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就無法構造了,產生了矛盾;

因此,構造函數不能爲虛函數。


對於析構函數而言,可以爲虛函數,因爲此時虛函數表早已建立;並且,常常析構函數都是虛函數。原因就是,通過基類指針在銷燬對象的時候,可以正確的識別要銷燬對象的類型,從而防止析構不完全的出現。


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