重寫建構子中的虛擬函數
考慮以下程式碼片段:
#include <iostream> struct base { virtual const int value() const { return 0; } base() { // Default constructor std::cout << value() << std::endl; } }; struct derived : public base { virtual const int value() const { return 1; } }; int main() { derived d; // Declares an instance of the derived class }
當我們執行此代碼時,它會列印0 而不是預期的1。為什麼?
建構期間的虛函數呼叫
當基類建構函式在建構函式中呼叫虛函式時,虛函式是在基類實例上呼叫的,而不是在基底類別實例上呼叫的衍生類別實例。這是物件在建構過程中「成熟」過程的結果。
在我們的範例中,當部分建構物件時,基本建構函式呼叫value()。 value() 的原始基本實作。 1,可以避免呼叫虛擬函數在建構函式中。 ,而不是直接從其成員函數呼叫:
使用成員初始化清單:
使用成員初始化清單在建構函式中明確指定虛擬函式的值:
以上是為什麼在基類構造函數中呼叫虛擬函數會導致使用基類實作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!