'class1::function1': 覆寫虛擬函式傳回型別會有所不同,而且與 'class2::function2' 不是共變數
備註
虛擬函式和衍生覆寫函式具有相同的參數清單,但不同的傳回型別。
在C++中,衍生類別中的覆寫函式不能只因基類中的虛擬函式傳回型別而有所不同。
特定傳回型別有此規則的例外狀況。 當衍生類別覆寫公用基類時,它可能會傳回衍生類別的指標或參考,而不是基類指標或參考。 這些傳回型別稱為 covariant,因為它們會隨著類型而有所不同。 此規則例外狀況不允許 covariant reference-to-pointer 或 pointer-to-pointer 類型。
解決錯誤的其中一種方法是傳回與基類相同的類型。 然後,在呼叫虛擬函式之後轉換傳回值。 另一個是變更參數清單,讓衍生類別成員函式成為多載,而不是覆寫。
範例
如果您使用 編譯 /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。