Delen via


Compilerfout C2555

'klasse1::function1': het overschrijven van het retourtype van de virtuele functie verschilt en is niet covariant van 'klasse2::function2'

Opmerkingen

Een virtuele functie en een afgeleide overschrijvende functie hebben identieke parameterlijsten, maar verschillende retourtypen.

In C++kan een overschrijvende functie in een afgeleide klasse niet alleen verschillen door het retourtype van een virtuele functie in een basisklasse.

Er is een uitzondering op deze regel voor bepaalde retourtypen. Wanneer een afgeleide klasse een openbare basisklasse overschrijft, kan deze een aanwijzer of verwijzing naar de afgeleide klasse retourneren in plaats van een verwijzing of verwijzing naar de basisklasse. Deze retourtypen worden covariant genoemd, omdat ze samen met het type verschillen. Deze regel uitzondering staat geen covariant reference-to-pointer- of pointer-to-pointer-types toe.

Een manier om de fout op te lossen, is door hetzelfde type als de basisklasse te retourneren. Cast vervolgens de retourwaarde nadat de virtuele functie is aangeroepen. Een andere manier is om de parameterlijst te wijzigen, zodat de lidfunctie van de afgeleide klasse een overloading wordt in plaats van een override.

Voorbeelden

Deze fout kan optreden als u compileert met /clr. De C++ komt bijvoorbeeld overeen met de volgende C#-declaratie:

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

is

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

In het volgende voorbeeld wordt C2555 gegenereerd:

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

U kunt dit oplossen door het retourtype te wijzigen in Y::funcvoid.