為什麼不能從構造函數呼叫虛函數
在C 中,虛函數透過啟用派生對象,在多態性中發揮著至關重要的作用類別重寫從其基底類別繼承的方法。然而,當嘗試從類別建構函數中呼叫虛擬函數時,會出現一個常見的誤解。
考慮以下範例程式碼:
struct base { virtual const int value() const { return 0; } base() { std::cout << value() << std::endl; } virtual ~base() {} }; struct derived : public base { virtual const int value() const { return 1; } }; int main(void) { derived example; }
當此程式碼執行時,它輸出「0」而不是預期的「1」。為什麼?
原因在於建構子的執行順序。建立衍生類別物件時,首先呼叫基底類別建構函數。此時,派生類別物件尚未完全建構完成,其虛方法無法可靠地呼叫。
當基底類別建構子呼叫 value() 時,會存取基底類別的虛擬函式實現,因為衍生類別尚未「成熟」為衍生物件。為了確保正確呼叫虛擬函數,必須從完全建構的物件中存取它們。
因此,要修復程式碼並輸出“1”,基類建構函式中的 value() 方法呼叫必須是刪除或延遲到物件完全建構完成之後。
以上是為什麼在建構函式中呼叫的虛函數會傳回基類實作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!