编译器警告(等级 4)C4373

“function”:虚函数替代“base_function”,当参数只在 const/volatile 限定符上有差异时,早期版本的编译器不会替代

注解

你的应用程序在一个派生类中包含一个方法,该方法替代基类中的虚拟方法。 替代方法中的参数与虚拟方法的参数的不同之处在于 constvolatile 限定符。

在 Visual Studio 2008 之前,编译器会将函数绑定到基类中的方法。 后续版本的编译器忽略 constvolatile 限定符,将函数绑定到派生类中的方法,然后发出警告 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