Udostępnij za pomocą


Błąd kompilatora C2555

"class1::function1": zastępowanie typu zwracanego funkcji wirtualnej różni się i nie jest kowariantne z klasy "class2::function2"

Funkcja wirtualna i pochodna funkcja zastępowania mają identyczne listy parametrów, ale różne typy zwracane.

Uwagi

W języku C++funkcja zastępowania w klasie pochodnej nie może różnić się tylko typem zwrotnym z funkcji wirtualnej w klasie bazowej.

Istnieje wyjątek od tej reguły dla niektórych typów zwracanych. Gdy klasa pochodna zastępuje publiczną klasę bazową, może zwrócić wskaźnik lub odwołanie do klasy pochodnej zamiast wskaźnika lub odwołania klasy bazowej. Te typy zwracane są nazywane kowariantnymi, ponieważ różnią się one w zależności od typu. Ten wyjątek reguły nie zezwala na kowariantne typy odwoływania się do wskaźnika lub wskaźnika do wskaźnika.

Jednym ze sposobów rozwiązania błędu jest zwrócenie tego samego typu co klasa bazowa. Następnie rzutuj wartość zwracaną po wywołaniu funkcji wirtualnej. Innym jest również zmiana listy parametrów, aby składowa klasy pochodnej działała jako przeciążenie zamiast przesłonięcia.

Przykłady

Ten błąd może zostać wyświetlony w przypadku kompilacji za pomocą /clrpolecenia . Na przykład kod C++ jest odpowiednikiem następującej deklaracji języka C#:

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

is

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

Poniższy przykład generuje kod C2555:

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

Aby rozwiązać ten problem, zmień typ zwracany na Y::func void.