コンパイラの警告 (レベル 3) C4373

'function': 仮想関数が 'base_function' をオーバーライドします。以前のバージョンのコンパイラでは、パラメーターが const/volatile 修飾子でのみ異なる場合、オーバーライドされませんでした

解説

アプリケーションには、基底クラスの仮想メソッドをオーバーライドする派生クラスのメソッドが含まれ、オーバーライドする側のメソッドのパラメーターは、 const または volatile 修飾子についてのみ、仮想メソッドのパラメーターと異なります。 つまり、コンパイラでは、基底クラスまたは派生クラスのいずれかにおけるメソッドに、関数参照をバインドする必要があります。

Visual Studio 2008 より前のバージョンのコンパイラでは、関数を基底クラスのメソッドにバインドした後、警告メッセージが表示されます。 それ以降のバージョンのコンパイラでは、const または volatile の修飾子を無視して、関数を派生クラスのメソッドにバインドし、警告 C4373 が表示されます。 後の動作は、C++ 標準に準拠しています。

次のコード例では、警告 C4373 が生成されます。 この問題を解決するには、オーバーライドで基本メンバー関数と同じ CV 修飾子を使用するか、オーバーライドを作成しない場合は、派生クラスの関数に別の名前を付けることができます。

// c4373.cpp
// compile with: /c /W3
#include <stdio.h>
struct Base
{
    virtual void f(int i) {
        printf("base\n");
    }
};

struct Derived : Base
{
    void f(const int i) {  // C4373
        printf("derived\n");
    }
};

int main()
{
    Derived d;
    Base* p = &d;
    p->f(1);
}
derived