'class1::function1': オーバーライドする仮想関数の戻り値の型が異なり、'class2::function2' の covariant ではありません
解説
仮想関数と派生オーバーライド関数のパラメーター リストは同じですが、戻り値の型は異なります。
C++ では、派生クラスのオーバーライド関数は、戻り値の型によってのみ基本クラスの仮想関数と異なることはできません。
この規則には、特定の戻り値の型に対する例外があります。 派生クラスがパブリック基本クラスをオーバーライドすると、基本クラスのポインターまたは参照ではなく、派生クラスへのポインターまたは参照が返される場合があります。 これらの戻り値の型は、型と共に変化するため、covariant と呼ばれます。 この規則の例外では、共変の参照からポインターへの型またはポインターからポインターへの型は許可されません。
エラーを解決する方法の 1 つは、基底クラスと同じ型を返すことです。 次に、仮想関数が呼び出された後に戻り値をキャストします。 もう 1 つの方法として、パラメーター リストを変更して、派生クラス メンバー関数をオーバーライドではなくオーバーロードにすることもできます。
例
/clr を使用してコンパイルすると、このエラーが表示される場合があります。 たとえば、C++ は次の C# 宣言と同等です。
Guid[] CheckSources(Guid sourceID, Guid[] carouselIDs);
is
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 に変更します。