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

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

解説

アプリケーションには、基底クラスの仮想メソッドをオーバーライドする派生クラスのメソッドが含まれています。 オーバーライドするメソッドのパラメーターは、仮想メソッドのパラメーターと a 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