在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.
協變返回機制將我們從這樣的一種處境解脫出來:不得不使用易於出錯的轉換操作來「重新
」提供型別資訊,而這種資訊是一開始就不應該丟掉的:(那麼,對於友元,派生的
operator+
,怎麼樣呼叫基類的
operator+
呢?)shape * s =getacircleorothershape ();
const shapeeditor &sed =s->geteditor();
ciecle *c =getacircle();
const circleeditor &ced =c->geteditor();
c 返回型別協變
在c 中,只要原來的返回型別是指向基類的指標或引用,新的返回型別是指向派生類的指標或引用,覆蓋的方法就可以改變返回型別。這樣的型別稱為協變返回型別 covariant returns type 覆蓋要求函式具有完全相同的入參。一般覆蓋具有相同的返回值,否則會提示錯誤 virtual double a...
協變返回型別
一般來說,乙個重寫的函式與被它重寫的函式必須具有相同的返回型別 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...