仮想関数をコンストラクターから呼び出すことができない理由
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 サイトの他の関連記事を参照してください。