c 返回型別協變

2021-08-01 11:28:35 字數 1154 閱讀 7067

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