Поделиться через


Предупреждение компилятора (уровень 4) C4373

"function": виртуальная функция переопределяет "base_function", предыдущие версии компилятора не переопределяются, если параметры отличаются только конст/переменными квалификаторами

Замечания

Приложение содержит метод в производном классе, который переопределяет виртуальный метод в базовом классе. Параметры в методе переопределения отличаются или квалификатором constvolatile от параметров виртуального метода.

До 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