ホームページ > バックエンド開発 > C++ > 基本クラスのコンストラクターで仮想関数を呼び出すと、派生クラスの値ではなく、基本クラスの値が出力されるのはなぜですか?

基本クラスのコンストラクターで仮想関数を呼び出すと、派生クラスの値ではなく、基本クラスの値が出力されるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-21 05:24:10
オリジナル
460 人が閲覧しました

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() を持つクラスベース。派生クラスは、base から継承し、value() をオーバーライドします。 Base のコンストラクターは、そのコンストラクター内で value() を呼び出そうとします。

派生のコンストラクターが呼び出されると、base のコンストラクターが最初に呼び出されます。この時点では、オブジェクトはまだ基本クラスの状態にあり、value() は基本クラスの実装に解決されます。これが、プログラムが期待される "1" ではなく "0" を出力する理由です。

この問題に対処するには、コンストラクターで value() を呼び出す前に、オブジェクトが派生クラスとして完全に初期化されていることを確認する必要があります。 。これを実現する 1 つの方法は、派生クラスのコンストラクターが実行されるまで value() の呼び出しを遅らせることです。これは、派生クラスのコンストラクターで仮想関数を使用することで実行できます。

以上が基本クラスのコンストラクターで仮想関数を呼び出すと、派生クラスの値ではなく、基本クラスの値が出力されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート