Partager via


Erreur du compilateur C2555

'class1 ::function1' : le remplacement du type de retour de fonction virtuelle diffère et n’est pas covariant de 'class2 ::function2'

Une fonction virtuelle et une fonction de substitution dérivée ont des listes de paramètres identiques, mais différents types de retour.

Notes

En C++, une fonction de substitution dans une classe dérivée ne peut pas différer uniquement par type de retour d’une fonction virtuelle dans une classe de base.

Il existe une exception à cette règle pour certains types de retour. Lorsqu’une classe dérivée remplace une classe de base publique, elle peut retourner un pointeur ou une référence à la classe dérivée au lieu d’un pointeur ou d’une référence de classe de base. Ces types de retour sont appelés covariants, car ils varient avec le type. Cette exception de règle n’autorise pas les types de référence à pointeur ou pointeur covariants.

Une façon de résoudre l’erreur consiste à retourner le même type que la classe de base. Ensuite, cassez la valeur de retour après l’appel de la fonction virtuelle. Une autre consiste à modifier la liste des paramètres pour que la fonction membre de classe dérivée soit une surcharge au lieu d’une substitution.

Exemples

Cette erreur peut s’afficher si vous compilez avec /clr. Par exemple, l’équivalent C++ de la déclaration C# suivante :

Guid[] CheckSources(Guid sourceID, Guid[] carouselIDs);

is

Guid CheckSources(Guid sourceID, Guid carouselIDs[]) [];

L’exemple suivant génère l’erreur C2555 :

// C2555.cpp
// compile with: /c
struct X {
   virtual void func();
};
struct Y : X {
   char func();  // C2555
   void func2();   // OK
};

Pour résoudre ce problème, remplacez le type de retour par Y::func void.