首頁 > 後端開發 > C++ > 為什麼從建構函式呼叫的 C 虛擬函數傳回基底類別值?

為什麼從建構函式呼叫的 C 虛擬函數傳回基底類別值?

Susan Sarandon
發布: 2024-12-06 13:24:12
原創
695 人瀏覽過

Why Do C   Virtual Functions Called from a Constructor Return the Base Class Value?

為什麼從構造函數呼叫的C 虛函數可能會出現意外

在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()。人們可能期望程式碼在運行時會列印“1”,因為正在建構派生類型的物件。然而,它卻輸出「0」。

這種行為的原因在於物件建構的順序。當初始化派生類型的物件時,首先呼叫基底類別建構函數。此時,該物件尚未完全初始化,並且可能尚未初始化其衍生類別特定的資料成員。因此,從基底構造函數呼叫 value() 會呼叫該函數的基類實現,該實現傳回 0。

要實現預期的行為,應該從後建構函式呼叫 value() 函式階段,保證物件完全初始化。這可以透過重寫衍生類別中的 value() 函數並從保證在建構後呼叫的單獨方法呼叫它來完成。例如:

struct derived : public base {
   virtual const int value() const {
      return 1;
   }
   int get_value() const {
      return value();
   }
};
登入後複製

這種情況下,可以從建構子呼叫 get_value() 方法來取得正確的值「1」。

以上是為什麼從建構函式呼叫的 C 虛擬函數傳回基底類別值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板