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();
[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();
相关文章推荐
- [c++ primer plus]虚函数的返回类型协变
- c++ 类覆盖方法中的协变返回类型
- C++基础::语法特性::函数重写(override)与协变返回类型(covariant return type)
- c++ 类覆盖方法中的协变返回类型
- C++动态绑定及返回类型协变
- c++返回类型协变
- 理解Java中的协变返回类型
- java协变返回类型使用示例
- C++中为什么不允许通过返回类型重载函数的辩论
- C/C++—— 写一个函数,它的参数为指向函数的指针,返回类型也为指向函数的指针
- 协变返回类型
- 协变返回类型
- C++必知必会之(31)协变返回类型
- 协变、逆变与不变:数组、泛型、与返回类型
- C++函数返回值类型
- c++解决 {ctor}构造函数不能有返回类型或者无故缺少“;”(在“using”的前面)的问题
- 在Scala中,为什么函数的参数类型是逆变的,而函数的返回值协变的
- 仅返回类型不同的函数,在C++中如何实现重载?
- C++中赋值运算符默认的返回值类型
- 编程思想 之「多态、初始化顺序、协变返回类型」