[心得] 原来继承不可逆

楼主: gecer (gecer)   2017-10-01 10:51:55
#include <iostream>
using namespace std;
class Base
{
public:
virtual void function1() {cout<<"Base :: function1()\n";};
virtual ~Base(){};
};
class D1: public Base
{
public:
~D1(){};
void function1() { cout<<"D1 :: function1()\n";};
};
class D2: public D1
{
public:
~D2(){};
void function1() { cout<<"D2 :: function1()\n";};
};
int main()
{
D2 *d2=new D2;
D1 *d1=new D1;
Base *b=new Base;
D1 *dd;
dd=d2;
dd->function1();
dd=d1;
dd->function1();
dd=b;
dd->function1();
return (0);
}
小弟先定义class Base->继承给D1->继承给D2 then 宣告D1 *dd 指标给各class
当dd指标Base(dd=b)时 compiler 便会出现
error: invalid conversion from 'Base*' to 'D1*' [-fpermissive
原来继承不可指标逆回上一层
作者: CoNsTaR ((const *))   2017-10-01 11:26:00
这个概念在电脑科学里叫做 covariance 和 contravariance有一些语言的函数也可以分 super 和 sub 满有趣的然后 variance 的概念告诉你哪个是哪个的 sub 或 super以及为什么 super 不能转 sub,但相反却可以super 就是你的 base 的意思,sub 就是 child
作者: LPH66 (-6.2598534e+18f)   2017-10-01 18:48:00
NONONO, covariance / contravariance 是继承链类别的衍生出来的型别之间的关系, 这里只是单纯的父指标不能指子而已以此例来说若谈论 Base[] D1[] D2[] 的关系或 vector<Base> vector<D1> vector<D2> 的关系这才会用上 *-variance 这个用语
作者: CoNsTaR ((const *))   2017-10-01 21:34:00
指标应该可以看成是一个 type function 吧所以照 c++ 的写法,D1* 应该可以想成是 *<D1> 之类的东西所以 *<B> 不能直接转 *<D> 意思就是 B* 不能直接转 D*至少我是这样理解为什么父指标不能直接转子的喔喔 楼上的意思是只有衍生型别可以用 variance 吗?那我就不知道了 XDD那如果两个型别各自从不同型别衍生出来,他们比大小可以用 variance 这个词吗?或是如果我说,因为 * 是 covariant 所以 B* 不能转 D*,这样讲正确吗?
作者: firose (guest也是也是也是也是也)   2017-10-01 22:57:00
variance 应该是用在继承上的,在符合 LSP 的前提之下对于函数的传回值与参数,也可以有继承关系上的变化
作者: LPH66 (-6.2598534e+18f)   2017-10-02 08:02:00
唔, 把 * 当成 type function 来讲吗...倒是没这么思考过; 稍微想一想应该是可以的这样 * 这个 type function 确实能说是 covariant
作者: Killercat (杀人猫™)   2017-10-02 23:58:00
其实我觉得你想到这case已经满厉害的了 XD写一辈子c++都没想过衔尾蛇

Links booklink

Contact Us: admin [ a t ] ucptt.com