仮想関数のデフォルト引数の動作
提供された C コードでは、仮想関数のオーバーロードとデフォルト引数によって奇妙な状況が発生します。問題を調査し、基礎となるメカニズムを理解しましょう。
コードは 2 つのクラス B と D を定義します。B にはデフォルト引数 10 を持つ仮想 print メソッドがあり、D は別のデフォルト引数 20 で print をオーバーライドします。 . D 型のオブジェクトを指す B 型のポインタを介して print を呼び出すと、期待される "D--data=20" の出力が取得されません。代わりに、出力には「D--data=10」と表示されます。
C 標準 (8.3.6.10) によれば、仮想関数呼び出しでは、ポインタまたは参照の static によって決定される宣言で定義されたデフォルトの引数が使用されます。タイプ。これは、print が B ポインタを介して呼び出された場合、D でオーバーライドされたにもかかわらず、デフォルトの引数を B から継承することを意味します。
説明は、デフォルトを決定するポインタの静的型 (B) にあります。仮想関数呼び出し中に使用される引数。指すオブジェクトの型が D であっても、ポインタの型によってデフォルトの引数の動作が決まります。
したがって、目的の出力 "D--data=20" を取得するには、print の呼び出しにポインタが使用されます。オーバーライドされたデフォルト引数を確実に使用するには、型 D である必要があります。
以上が仮想関数呼び出しが派生クラスではなく基本クラスからデフォルトの引数を継承するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。