您的位置:首页 > 编程语言 > C语言/C++

C++ 返回类型协变

2012-08-11 11:15 871 查看
[b]在C++中,只要原来的返回类型是指向类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型。这样的类型称为协变返回类型(Covariant returns type).[/b]



[b]返回类型协变[/b]

覆盖要求函数具有完全相同的入参。

一般覆盖具有相同的返回值,否则会提示错误

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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: