Поделиться через


Ошибка компилятора C2555

"class1::function1": переопределение типа возвращаемой функции отличается и не является ковариантным от "class2::function2"

Замечания

Виртуальная функция и производная переопределяющая функция имеют одинаковые списки параметров, но разные типы возвращаемых значений.

В C++переопределяющая функция в производном классе не может отличаться только по типу возврата от виртуальной функции в базовом классе.

Существует исключение из этого правила для определенных типов возвращаемых значений. Если производный класс переопределяет общедоступный базовый класс, он может возвращать указатель или ссылку на производный класс вместо указателя базового класса или ссылки. Эти типы возвращаемых значений называются ковариантными, так как они различаются вместе с типом. Это исключение правила не разрешает ковариантные типы ссылок на указатель или указатели на указатели.

Один из способов устранить ошибку — вернуть тот же тип, что и базовый класс. Затем приведите возвращаемое значение после вызова виртуальной функции. Другим является изменение списка параметров, чтобы сделать производную функцию-член класса перегрузкой вместо переопределения.

Примеры

При компиляции с /clrпомощью этой ошибки может возникнуть эта ошибка. Например, C++ эквивалентен следующему объявлению C#:

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

-

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

В следующем примере возникает ошибка C2555:

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

Чтобы исправить его, измените тип возвращаемого Y::funcvoidзначения .