컴파일러 오류 C2555
'class1::function1': 가상 함수 반환 형식을 재정의하는 것은 다르며 'class2::function2'와 공변하지 않습니다.
가상 함수와 파생 재정의 함수에는 매개 변수 목록이 동일하지만 반환 형식은 다릅니다.
설명
C++에서 파생 클래스의 재정의 함수는 기본 클래스의 가상 함수에서 반환 형식으로만 다를 수 없습니다.
이 규칙에는 특정 반환 형식에 대한 예외가 있습니다. 파생 클래스가 공용 기본 클래스를 재정의하는 경우 기본 클래스 포인터 또는 참조 대신 파생 클래스에 대한 포인터 또는 참조를 반환할 수 있습니다. 이러한 반환 형식은 형식과 함께 다르기 때문에 공변성이라고 합니다. 이 규칙 예외는 공변 참조-포인터 또는 포인터-포인터 형식을 허용하지 않습니다.
오류를 해결하는 한 가지 방법은 기본 클래스와 동일한 형식을 반환하는 것입니다. 그런 다음 가상 함수가 호출된 후 반환 값을 캐스팅합니다. 또 다른 방법은 매개 변수 목록을 변경하여 파생 클래스 멤버 함수를 재정의 대신 오버로드로 만드는 것입니다.
예제
를 사용하여 /clr
컴파일하는 경우 이 오류가 표시 될 수 있습니다. 예를 들어 다음 C# 선언에 해당하는 C++는 다음과 같습니다.
Guid[] CheckSources(Guid sourceID, Guid[] carouselIDs);
is
Guid CheckSources(Guid sourceID, Guid carouselIDs[]) [];
다음 샘플에서는 C2555를 생성합니다.
// C2555.cpp
// compile with: /c
struct X {
virtual void func();
};
struct Y : X {
char func(); // C2555
void func2(); // OK
};
이 문제를 해결하려면 반환 형식을 .로 Y::func
변경합니다 void
.