首页 > 编程语言 > 详细

c++ 类覆盖方法中的协变返回类型

时间:2017-10-17 23:47:34      阅读:345      评论:0      收藏:0      [点我收藏+]

c++ 类覆盖方法中的协变返回类型

 

在C++中,只要原来的返回类型是指向类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型。这样的类型称为协变返回类型(Covariant returns type).

 

协变(covariant),如果它保持了子类型序关系≦。该序关系是:子类型≦基类型。
逆变(contravariant),如果它逆转了子类型序关系。

 

参数逆变:正是因为需要符合里氏替换法则,方法中的参数类型声明时必须符合逆变(或不变),以让子类方法可以接收更大的范围的参数(处理能力增强);而不能声明为协变,子类方法可接收的范围是父类中参数类型的子集(处理能力减弱)。
返回值协变:如果结果类型是逆变的,那子类方法的处理能力是减弱的,不符合里氏替换。因此返回值类型声明时必须符合协变(或不变)
 
编程语言里一个真理就是父类引用可以指向子类实例 比如
大筐 base b =小筐 new child()
这就像一个父类大筐里面能放下一个子类小筐

具体到协变逆变 举个例子

A function (B)
{
        return C
}
D ret = function(F);


如上面所示 根据大筐装小筐理论

D只能是A或者A的父类,这就是返回值协变。已经有个小筐了,你要装他只能用大筐,不能用可以变小的小筐来装小筐,因此这个小筐不能支持变小,就是小筐要协变(大)。

F必须是B或者B的子类,这就是参数逆变。就是给你个大筐在那里放着,你要装只能装个可以变小的小筐进去,也就是放进去的筐可以变小,也就是大筐要逆变(小)。



 

c++ 类覆盖方法中的协变返回类型

原文:http://www.cnblogs.com/lsgxeva/p/7684545.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!