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();

posted on 2012-08-11 11:15  IT@民工  阅读(4690)  评论(0编辑  收藏  举报

导航