编译器错误 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::func 的返回类型更改为 void