C++ 返回類型協變


在C++中,只要原來的返回類型是指向類的指針或引用,新的返回類型是指向派生類的指針或引用,覆蓋的方法就可以改變返回類型。這樣的類型稱為協變返回類型(Covariant returns type).

 

返回類型協變

覆蓋要求函數具有完全相同的入參

一般覆蓋具有相同的返回值,否則會提示錯誤

virtualdouble area ()const = 0;
virtualfloatarea ()const ; //編譯器提示錯誤,返回類型不同

 

這個規則對返回類型協變而言,則有所放松。覆蓋的返回值不區分基類或派生類。從語意上理解,一個派生類也是一個基類。如下:

 

Class ShapeEditor ...{……};
Class Shape
...{
public:
virtualconstShapeEditor & getEditor ()const = 0; //Factory Method
};

Class Circle;
Class CircleEditor : public ShapeEditor...{ … };
Class Circle : Public Shape
...{
public:
const CircleEditor &getEditor ()const ;
};

在這個例子中,注意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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM