首頁 >後端開發 >C++ >為什麼虛擬函數在 C 物件初始化期間表現異常?

為什麼虛擬函數在 C 物件初始化期間表現異常?

Linda Hamilton
Linda Hamilton原創
2024-12-11 13:22:16759瀏覽

Why Do Virtual Functions Behave Unexpectedly During C   Object Initialization?

了解C 中的繼承和物件初始化以實現虛擬函數存取

在C 中,繼承允許建立繼承屬性和行為的派生類別來自基底類別。然而,C 中物件的初始化順序會影響虛擬函數的行為。

問題:

當在 C 中使用具有 virtual 的基類構造物件時函數,為什麼該函數會表現出來出乎意料嗎?

答案:

這裡的關鍵概念是基底類別和衍生類別的初始化順序。在 C 中,基底類別在衍生類別之前構造。

說明:

在提供的範例中:

  • 基類定義了一個預設回傳0的虛函數value()。
  • 衍生繼承自base並覆寫value()函數傳回 1。
  • 在實例化時,它首先建構物件的基礎部分。
  • 但是,此時該物件還不是一個完整的派生實例,因為派生類別建構子尚未執行。
  • 因此,當基底建構子呼叫 value() 時,它會呼叫該函數的基底版本而不是重寫的衍生版本,從而導致輸出為 0。

要修正此行為:

為了確保在物件建構期間呼叫派生類別的value() 函數,您應該使用衍生類別實例的位址顯式初始化基底類別:

derived example;
base(&example).value()

透過傳遞派生物件的位址,您可以指示基本建構函式在衍生物件上調用value() 函數,有效地將物件「成熟」為其完整的派生形式。

以上是為什麼虛擬函數在 C 物件初始化期間表現異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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