C 返回型別協變

2021-06-08 11:18:02 字數 1419 閱讀 4351

在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...