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

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

Mary-Kate Olsen
リリース: 2024-12-10 11:48:34
オリジナル
360 人が閲覧しました

Why Do Virtual Functions Called in a Constructor Return the Base Class Implementation?

仮想関数をコンストラクターから呼び出すことができない理由

C では、仮想関数は派生オブジェクトを有効にすることでポリモーフィズムにおいて重要な役割を果たします。クラスを使用して、基本クラスから継承されたメソッドをオーバーライドします。ただし、クラス コンストラクター内から仮想関数を呼び出そうとすると、よくある誤解が生じます。

次のコード例を考えてみましょう。

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

このコードを実行すると、代わりに "0" が出力されます。予想される「1」。なぜでしょうか?

理由はコンストラクターの実行順序にあります。派生クラス オブジェクトが作成されると、最初に基本クラスのコンストラクターが呼び出されます。この時点では、派生クラス オブジェクトはまだ完全に構築されておらず、その仮想メソッドを確実に呼び出すことができません。

基本クラスのコンストラクターが value() を呼び出すと、仮想関数の基本クラス実装にアクセスします。派生クラスはまだ派生オブジェクトに「成熟」していません。仮想関数が正しく呼び出されるようにするには、完全に構築されたオブジェクト内から仮想関数にアクセスする必要があります。

したがって、コードを修正して「1」を出力するには、基本クラスのコンストラクターの value() メソッド呼び出しを次のようにする必要があります。オブジェクトが完全に構築されるまで削除または延期されます。

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

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