ホームページ > バックエンド開発 > C++ > C オブジェクトの初期化中に仮想関数が予期しない動作をするのはなぜですか?

C オブジェクトの初期化中に仮想関数が予期しない動作をするのはなぜですか?

Linda Hamilton
リリース: 2024-12-11 13:22:16
オリジナル
780 人が閲覧しました

Why Do Virtual Functions Behave Unexpectedly During C   Object Initialization?

仮想関数アクセスのための C での継承とオブジェクトの初期化を理解する

C では、継承によりプロパティと動作を継承する派生クラスを作成できます。基本クラスから。ただし、C でのオブジェクトの初期化順序は、仮想関数の動作に影響を与える可能性があります。

質問:

仮想関数を持つ基本クラスを使用してオブジェクトが C で構築される場合関数、その関数がなぜ動作するのか

答え:

ここでの重要な概念は、基本クラスと派生クラスの初期化の順序です。 C では、基底クラスは派生クラスの前に構築されます。

説明:

提供された例:

  • 基底クラスは、デフォルトで 0 を返す仮想関数 value()。
  • derived は Base から継承し、 value() 関数は 1 を返します。
  • 派生がインスタンス化されると、最初にオブジェクトの基本部分が構築されます。
  • ただし、この時点では、オブジェクトはまだ完全な派生インスタンスではありません。派生クラスのコンストラクターがまだ実行されていないためです。
  • したがって、基本コンストラクターが value() を呼び出すと、関数の基本バージョンが呼び出されます。オーバーライドされた派生バージョンではなく、出力は 0 になります。

この動作を修正するには:

派生クラスの value() 関数がオブジェクトの構築中に呼び出される場合は、派生クラスのアドレスを使用して基本クラスを明示的に初期化する必要があります。インスタンス:

derived example;
base(&example).value()
ログイン後にコピー

派生オブジェクトのアドレスを渡すことにより、派生オブジェクトの value() 関数を呼び出すように基本コンストラクターに指示し、オブジェクトを完全な派生形式に効果的に「成熟」させます。

以上がC オブジェクトの初期化中に仮想関数が予期しない動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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