跟我学C++中级篇——协变和逆变

一、协变和逆变

协变(Covariance) 和 逆变(Contravariance),面向对象编程的语言里都可以看到这两个定义。看一个比较严格的定义:
逆变与协变用来描述类型转换(type transformation)后的继承关系,其定义:如果A、B表示类型,f(⋅)表示类型转换,≤表示继承关系(A≤B表示A是由B派生出来的子类)
f(⋅)是逆变(contravariant)的,当A≤B时有f(B)≤f(A)成立;
f(⋅)是协变(covariant)的,当A≤B时有f(A)≤f(B)成立;
f(⋅)是不变(invariant)的,当A≤B时上述两个式子均不成立,即f(A)与f(B)相互之间没有继承关系。
估计数学有点不好的,得琢磨一下。
协变和逆变其实应用更多是在泛型编程中,在一般的编程中,反而有更具体的行为规范。所以可以把协变和逆变称为一种更高一层的抽象概念。协变是从父类型到子类型中,类型越来越具现化或者说更具体;逆变是从父类到子类型中,类型越来越抽象(注意表述的本质)。

二、具体分析说明

其实只要明白了一点就明白了它的作用,就是用来处理继承关系的类型转换控制的。说成大白话就是,协变就是某种操作被应用到父子类型(子≤父)后,子类型还是子类型,父类型还是父类型,但父类型可以由子类型来表示(就是父类型的变量可以由子类型的变量赋值,这个好理解,也是上面提到的越来越具体)。举一个比较简单的例子就是:

class Father{
   };
class Son:public Father{
   };
Father *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值