다음을 통해 공유


컴파일러 경고(수준 4) C4373

'function': 가상 함수가 'base_function'을 재정의합니다. 이전 버전의 컴파일러는 매개 변수가 const/volatile 한정자만 다를 때 재정의하지 않았습니다.

설명

애플리케이션에는 기본 클래스의 가상 메서드를 재정의하는 파생 클래스의 메서드가 포함되어 있습니다. 재정의 메서드의 매개 변수는 가상 메서드의 매개 변수와 한 const 정자 또는 volatile 한정자마다 다릅니다.

Visual Studio 2008 이전에는 컴파일러가 함수를 기본 클래스의 메서드에 바인딩합니다. 컴파일러의 이후 버전은 또는 volatile 한정자를 무시하고const, 함수를 파생 클래스의 메서드에 바인딩한 다음, 경고 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