首頁 >後端開發 >C++ >為什麼在基類構造函數中呼叫虛擬函數會導致使用基類實作?

為什麼在基類構造函數中呼叫虛擬函數會導致使用基類實作?

Barbara Streisand
Barbara Streisand原創
2024-12-21 02:03:15819瀏覽

Why Does Calling a Virtual Function in a Base Class Constructor Result in the Base Class Implementation Being Used?

重寫建構子中的虛擬函數

考慮以下程式碼片段:

#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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn