Compartilhar via


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.