Condividi tramite


Errore del compilatore C2555

'class1::function1': l'override del tipo restituito della funzione virtuale differisce e non è covariante da 'class2::function2'

Una funzione virtuale e una funzione di override derivata hanno elenchi di parametri identici, ma tipi restituiti diversi.

Osservazioni:

In C++, una funzione di override in una classe derivata non può essere diversa solo dal tipo restituito da una funzione virtuale in una classe di base.

Esiste un'eccezione a questa regola per determinati tipi restituiti. Quando una classe derivata esegue l'override di una classe base pubblica, può restituire un puntatore o un riferimento alla classe derivata anziché un puntatore o un riferimento di classe base. Questi tipi restituiti sono denominati covarianti, perché variano insieme al tipo. Questa eccezione di regola non consente tipi di puntatore o puntatore a riferimento covariante.

Un modo per risolvere l'errore consiste nel restituire lo stesso tipo della classe base. Eseguire quindi il cast del valore restituito dopo la chiamata della funzione virtuale. Un altro consiste nel modificare anche l'elenco di parametri, per rendere la funzione membro della classe derivata un overload anziché un override.

Esempi

Questo errore può essere visualizzato se si esegue la compilazione con /clr. Ad esempio, C++ equivale alla dichiarazione C# seguente:

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

is

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

L'esempio seguente genera l'errore C2555:

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

Per correggerlo, modificare il tipo restituito di Y::func in void.