Error del compilador C2555
'clase1::función1': el tipo de valor devuelto de la función virtual de invalidación es distinto y no es covariante de 'clase2::función2'
Una función virtual y una función de invalidación derivada tienen listas de parámetros idénticas pero tipos de valor devuelto diferentes.
Comentarios
En C++, una función de invalidación en una clase derivada no puede diferir de una función virtual en una clase base solo por el tipo de valor devuelto.
Hay una excepción a esta regla para determinados tipos de valor devuelto. Cuando una clase derivada invalida una clase base pública, puede devolver un puntero o una referencia a la clase derivada en lugar de un puntero o referencia de clase base. Estos tipos devueltos se denominan covariantes, porque varían junto con el tipo. Esta excepción a la regla no permite tipos covariantes de referencia a puntero o puntero a puntero.
Una manera de resolver el error es devolver el mismo tipo que la clase base. A continuación, convierta el valor devuelto después de llamar a la función virtual. Otra forma es cambiar también la lista de parámetros para que la función miembro de clase derivada sea una sobrecarga en lugar de una invalidación.
Ejemplos
Es posible que vea este error si utiliza /clr
en la compilación. Por ejemplo, el equivalente de C++ a la siguiente declaración de C#:
Guid[] CheckSources(Guid sourceID, Guid[] carouselIDs);
is
Guid CheckSources(Guid sourceID, Guid carouselIDs[]) [];
El ejemplo siguiente genera el error C2555:
// C2555.cpp
// compile with: /c
struct X {
virtual void func();
};
struct Y : X {
char func(); // C2555
void func2(); // OK
};
Para corregirlo, cambie el tipo de valor devuelto Y::func
a void
.