在c++中,只要原來的返回型別是指向基類的指標或引用,新的返回型別是指向派生類的指標或引用,覆蓋的方法就可以改變返回型別。這樣的型別稱為協變返回型別(covariant returns type).
覆蓋要求函式具有完全相同的入參。
一般覆蓋具有相同的返回值,否則會提示錯誤
virtual
double area ()const = 0;
virtual
float area ()const ; //編譯器提示錯誤,返回型別不同
這個規則對返回型別協變而言,則有所放鬆。覆蓋的返回值不區分基類或派生類。從語意上理解,乙個派生類也是乙個基類。如下:
class shapeeditor ...;
class shape
...;
class circle;
class circleeditor : public shapeeditor...;
class circle : public shape
...;
在這個例子中,注意circleeditor必須在circle::geteditor的宣告之前被完整地定義(而不能僅僅宣告),因為編譯器必須知道circleeditor物件的布局,才能執行適當的位址操縱,從而將乙個circleeditor引用
(或指標)轉換為乙個shapeeditor引用(或指標)。
協變返回型別的優勢在於,總是可以在適當程度的抽象層面工作。若我們是處理shape,將獲得乙個抽象的shapeeditor;若正在處理某種具體的形狀型別,比如circle,我們就可以直接獲得ciecleeditor.協變返回機制將我們從這樣的一種處境解脫出來:不得不使用易於出錯的轉換操作來「重新」提供型別資訊,
協變返回型別的優勢在於,總是可以在適當程度的抽象層面工作。目前,一般認為,返回值可以協變,引數則不可以。
因此,在c++標準的虛函式中,返回值可以協變,引數不行。
C 返回型別協變
在c 中,只要原來的返回型別是指向類的指標或引用,新的返回型別是指向派生類的指標或引用,覆蓋的方法就可以改變返回型別。這樣的型別稱為協變返回型別 covariant returns type 返回型別協變 覆蓋要求函式具有 完全相同的入參 一般覆蓋具有相同的返回值,否則會提示錯誤 virtual d...
協變返回型別
一般來說,乙個重寫的函式與被它重寫的函式必須具有相同的返回型別 class shape class circle public shape 然而,這個規則對於 協變返回型別 covariant return type 的情形來說有所放鬆.也就是說,若b是乙個類型別,並且乙個基類虛函式返回b 那麼乙個...
C 協變逆變
1.泛型的協變逆變 注意 只能放在介面或者委託的泛型引數前面 1 委託泛型引數 static class testconsole private static argumentexception test1 object obj private static exception test2 stri...