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

コンストラクターから呼び出された C 仮想関数が基本クラスの値を返すのはなぜですか?

Susan Sarandon
リリース: 2024-12-06 13:24:12
オリジナル
694 人が閲覧しました

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;
}
ログイン後にコピー

このコードは、仮想関数を使用して 2 つのクラス (基本クラスと派生クラス) を定義します。価値()。基本コンストラクターは、オブジェクトの初期化中に 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 中国語 Web サイトの他の関連記事を参照してください。

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