C では、仮想関数を使用すると、派生クラスが基本クラスで定義された関数の実装をオーバーライドできます。ただし、仮想関数のデフォルトの引数の動作は混乱を招く可能性があります。
問題の説明:
次のコード スニペットを考えてみましょう:
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) によれば、ポインタまたは参照の場合、デフォルトの引数は、派生クラスのオーバーライド関数ではなく、ポインターまたは参照の静的型から派生します。
この場合、 bp は型 B のポインターであるため、B:: のデフォルト引数は、 print (10) が使用され、D::print のデフォルト引数 (20) がオーバーライドされます。
したがって、出力は次のようになります。予想される D--data=20 ではなく D--data=10.
以上が仮想関数のデフォルトの引数が派生クラスの値ではなく基本クラスの値を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。