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