首頁 >後端開發 >C++ >為什麼在建構函式中呼叫的虛函數會傳回基類實作?

為什麼在建構函式中呼叫的虛函數會傳回基類實作?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-10 11:48:34356瀏覽

Why Do Virtual Functions Called in a Constructor Return the Base Class Implementation?

為什麼不能從構造函數呼叫虛函數

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

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