컴파일러 경고(수준 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