仮想関数のデフォルト引数の動作: 予期せぬ難題
このコード スニペットでは、仮想関数のデフォルト引数の動作に関してジレンマが発生します。
class B { public: B(); virtual void print(int data = 10) { cout << endl << "B--data=" << data; } }; class D : public B { public: D(); void print(int data = 20) { cout << endl << "D--data=" << data; } }; int main() { B* bp = new D(); bp->print(); return 0; }
予想出力:
[ D--data=20 ]
実際の出力:
[ D--data=10 ]
動作の理解:
C標準では、セクション 8.3.6.10 で、仮想関数呼び出しのデフォルト引数は次のように規定されています。オブジェクトを表すポインタまたは参照の静的型によって決定されます。この例では、print 関数がタイプ B (bp) のポインターを介して呼び出されるため、B::print のデフォルト引数が利用され、予期しない出力が発生します。
結論:
ポインターまたは参照を通じて仮想関数を呼び出す場合、デフォルトの引数の動作を注意深く考慮する必要があります。ポインタまたは参照の静的型によって、どのデフォルト引数が使用されるかが決まります。これを正しく理解していないと、予期しない結果が生じる可能性があります。
以上が仮想関数呼び出しが派生クラスではなく基本クラスからデフォルトの引数を継承するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。