首頁 > 後端開發 > C++ > 為什麼在基底類別建構子中呼叫虛擬函數會列印基底類別值,而不是衍生類別值?

為什麼在基底類別建構子中呼叫虛擬函數會列印基底類別值,而不是衍生類別值?

Mary-Kate Olsen
發布: 2024-12-21 05:24:10
原創
440 人瀏覽過

Why Does Calling a Virtual Function in a Base Class Constructor Print the Base Class Value, Not the Derived Class Value?

虛函數的建構子呼叫

在 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() 的類別。派生類別繼承自基底類別並重寫 value()。 base 中的建構函式嘗試在其建構函式中呼叫 value()。

當呼叫派生的建構子時,先呼叫 base 的建構子。此時,該物件仍處於基底類別的狀態,並且 value() 解析為基底類別的實作。這就是為什麼程式會列印“0”而不是預期的“1”。

要解決這個問題,我們需要確保在建構函式中呼叫 value() 之前該物件已完全初始化為衍生類別。實現此目的的一種方法是延遲對 value() 的調用,直到執行派生類別的構造函數之後,這可以透過在衍生類別建構函數中使用虛擬函數來完成。

以上是為什麼在基底類別建構子中呼叫虛擬函數會列印基底類別值,而不是衍生類別值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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