C でのオーバーロードされた関数のオーバーライド
派生クラスが、オーバーロードされた基本クラスの関数をオーバーライドするシナリオを考えてみましょう。オーバーライドすると、派生クラスにオーバーロードされた関数が存在しないことを示すエラーが発生する場合があります。この動作は設計上の欠陥ではなく、 C の継承メカニズムの結果です。
デフォルトでは、クラスがメンバー関数をオーバーライドする場合、オーバーライドされたバージョンのみが派生クラスのスコープ内で考慮されます。したがって、基本クラス内の関数のオーバーロードされたバージョンにはアクセスできなくなります。
この問題を解決し、オーバーロード機能を維持するには、派生クラスで using ディレクティブを使用できます:
class bar : public foo {
using foo::a; // Bring overloads from 'foo' into 'bar'
};
using ディレクティブは、foo クラスの a のオーバーロードが bar クラスで使用可能であることを明示的に指定します。これにより、派生クラスは関数のすべてのオーバーロードされたバージョンにアクセスして使用できるようになります。
基本クラスと派生クラスの両方に同じオーバーロードが存在する場合、using ディレクティブを使用するとあいまいさが生じる可能性があることに注意することが重要です。さらに、既存のコードが基本クラスのオーバーロードの特定の動作に依存している場合、新しいオーバーロードを導入すると、その意図された機能が変更される可能性があります。したがって、この手法を使用する場合は注意が必要です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3