虛函數的建構子呼叫
在 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() 的類別。派生類別繼承自基底類別並重寫 value()。 base 中的建構函式嘗試在其建構函式中呼叫 value()。
當呼叫派生的建構子時,先呼叫 base 的建構子。此時,該物件仍處於基底類別的狀態,並且 value() 解析為基底類別的實作。這就是為什麼程式會列印“0”而不是預期的“1”。
要解決這個問題,我們需要確保在建構函式中呼叫 value() 之前該物件已完全初始化為衍生類別。實現此目的的一種方法是延遲對 value() 的調用,直到執行派生類別的構造函數之後,這可以透過在衍生類別建構函數中使用虛擬函數來完成。
以上是為什麼在基底類別建構子中呼叫虛擬函數會列印基底類別值,而不是衍生類別值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!