為什麼從構造函數呼叫的C 虛函數可能會出現意外
在C 中,虛函數提供動態綁定,允許派生類別重寫在其基底類別中定義的函數。但是,從構造函數呼叫虛擬函數可能會導致意外結果。
請考慮以下程式碼片段:
#include <iostream> 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; }
程式碼定義了兩個帶有虛擬函數的類別:基底類別和衍生類別價值()。基本建構函式在物件初始化期間呼叫 value()。人們可能期望程式碼在運行時會列印“1”,因為正在建構派生類型的物件。然而,它卻輸出「0」。
這種行為的原因在於物件建構的順序。當初始化派生類型的物件時,首先呼叫基底類別建構函數。此時,該物件尚未完全初始化,並且可能尚未初始化其衍生類別特定的資料成員。因此,從基底構造函數呼叫 value() 會呼叫該函數的基類實現,該實現傳回 0。
要實現預期的行為,應該從後建構函式呼叫 value() 函式階段,保證物件完全初始化。這可以透過重寫衍生類別中的 value() 函數並從保證在建構後呼叫的單獨方法呼叫它來完成。例如:
struct derived : public base { virtual const int value() const { return 1; } int get_value() const { return value(); } };
這種情況下,可以從建構子呼叫 get_value() 方法來取得正確的值「1」。
以上是為什麼從建構函式呼叫的 C 虛擬函數傳回基底類別值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!