コンストラクターから呼び出された 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 サイトの他の関連記事を参照してください。