型に互換性がないためオーバーライドされません
派生クラスのメソッドが virtual 基底クラスのメソッドをオーバーライドせずに隠している
説明
この欠陥は、派生クラスのメソッドが virtual 基底クラスのメソッドと同じ名前でパラメーター数も同じである一方、次の条件に合致する場合に発生します。
パラメーター リストで少なくとも 1 つのパラメーター タイプが異なっている。
パラメーター リストで
constなどの修飾子の有無が異なっている。
派生クラスのメソッドは、virtual 基底クラスのメソッドをオーバーライドせずに隠します。
リスク
誤って、基底クラスのメソッドを派生クラスのメソッドでオーバーライドするのではなく隠すことになる可能性があります。
基底クラスのメソッドが隠されており、派生クラスのオブジェクトを使用して基底クラスのパラメーターでメソッドを呼び出した場合は、代わりに派生クラスのメソッドが呼び出されます。渡される引数とタイプが一致しないパラメーターでは、キャストが発生する可能性があります。そうでない場合は、コンパイル エラーが発生します。
修正方法
基底クラスのバーチャル メソッドを派生クラスのメソッドでオーバーライドするには、同じパラメーター リストを使用してメソッドを宣言します。たとえば、必要に応じて、パラメーター タイプの変更や const 修飾子の追加を行います。
C++11 以降では、指定子 override を使用することによって、派生クラス内で意図したオーバーライド元のメソッドを宣言できます。指定子 override を使用して派生クラスのメソッドを宣言した場合は、基底クラスのメソッドと派生クラスのメソッドのパラメーター リストが異なっているとコンパイルが失敗します。派生クラスのメソッドが誤って基底クラスのメソッドを隠す可能性はないため、基底クラスのバーチャル メソッドのオーバーライドは確実に行われます。
それ以外の場合は、派生クラスの宣言に using という行を追加します。その結果、派生クラスのオブジェクトを使用して基底クラスのメソッドにアクセスできるようになります。Base_class_name::method_name
例
結果情報
| グループ: オブジェクト指向 |
| 言語: C++ |
| 既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: VIRTUAL_FUNC_HIDING |
| 影響度: Medium |
バージョン履歴
R2015b で導入