Erro do compilador C2555
'class1::function1': substituir o tipo de retorno de função virtual é diferente e não uma covariante de 'class2::function2'
Uma função virtual e uma função de substituição derivada têm listas de parâmetros idênticas, mas tipos de retorno diferentes.
Comentários
No C++, uma função de substituição em uma classe derivada não pode diferir apenas pelo tipo de retorno de uma função virtual em uma classe base.
Há uma exceção a essa regra para determinados tipos de retorno. Quando uma classe derivada substitui uma classe base pública, ela pode retornar um ponteiro ou referência à classe derivada em vez de um ponteiro ou referência de classe base. Esses tipos de retorno são chamados de covariantes, pois variam junto com o tipo. Essa exceção à regra não permite tipos covariantes de referência a ponteiro ou ponteiro a ponteiro.
Uma maneira de resolver o erro é retornar o mesmo tipo da classe base. Em seguida, converta o valor retornado depois que a função virtual tiver sido chamada. Outra maneira é alterar também a lista de parâmetros, para tornar a função de membro de classe derivada uma sobrecarga em vez de uma substituição.
Exemplos
Você poderá ver esse erro se compilar com /clr
. Por exemplo, o equivalente em C++ à seguinte declaração em C#:
Guid[] CheckSources(Guid sourceID, Guid[] carouselIDs);
está
Guid CheckSources(Guid sourceID, Guid carouselIDs[]) [];
O seguinte exemplo gera C2555:
// C2555.cpp
// compile with: /c
struct X {
virtual void func();
};
struct Y : X {
char func(); // C2555
void func2(); // OK
};
Para corrigi-lo, altere o tipo de retorno de Y::func
para void
.