C_and_CPP 板


LINE

#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 原来继承不可指标逆回上一层 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.255.30.171
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1506826318.A.2B3.html ※ 编辑: gecer (111.255.30.171), 10/01/2017 10:52:49 ※ 编辑: gecer (111.255.30.171), 10/01/2017 10:54:27
1F:推 CoNsTaR: 这个概念在电脑科学里叫做 covariance 和 contravariance 10/01 11:26
2F:→ CoNsTaR: 有一些语言的函数也可以分 super 和 sub 满有趣的 10/01 11:26
3F:推 CoNsTaR: 然後 variance 的概念告诉你哪个是哪个的 sub 或 super 10/01 11:29
4F:→ CoNsTaR: 以及为什麽 super 不能转 sub,但相反却可以 10/01 11:29
5F:→ CoNsTaR: super 就是你的 base 的意思,sub 就是 child 10/01 11:30
6F:推 LPH66: NONONO, covariance / contravariance 是继承链类别的衍生 10/01 18:48
7F:→ LPH66: 出来的型别之间的关系, 这里只是单纯的父指标不能指子而已 10/01 18:49
8F:→ LPH66: 以此例来说若谈论 Base[] D1[] D2[] 的关系 10/01 18:49
9F:→ LPH66: 或 vector<Base> vector<D1> vector<D2> 的关系 10/01 18:50
10F:→ LPH66: 这才会用上 *-variance 这个用语 10/01 18:50
11F:推 CoNsTaR: 指标应该可以看成是一个 type function 吧 10/01 21:34
12F:→ CoNsTaR: 所以照 c++ 的写法,D1* 应该可以想成是 *<D1> 之类的东 10/01 21:34
13F:→ CoNsTaR: 西 10/01 21:34
14F:→ CoNsTaR: 所以 *<B> 不能直接转 *<D> 意思就是 B* 不能直接转 D* 10/01 21:34
15F:→ CoNsTaR: 至少我是这样理解为什麽父指标不能直接转子的 10/01 21:34
16F:推 CoNsTaR: 喔喔 楼上的意思是只有衍生型别可以用 variance 吗? 10/01 21:44
17F:→ CoNsTaR: 那我就不知道了 XDD 10/01 21:44
18F:→ CoNsTaR: 那如果两个型别各自从不同型别衍生出来,他们比大小可以 10/01 21:44
19F:→ CoNsTaR: 用 variance 这个词吗? 10/01 21:44
20F:推 CoNsTaR: 或是如果我说,因为 * 是 covariant 所以 B* 不能转 D*, 10/01 22:01
21F:→ CoNsTaR: 这样讲正确吗? 10/01 22:01
22F:→ firose: variance 应该是用在继承上的,在符合 LSP 的前提之下 10/01 22:57
23F:→ firose: 对於函数的传回值与参数,也可以有继承关系上的变化 10/01 22:57
24F:推 LPH66: 唔, 把 * 当成 type function 来讲吗... 10/02 08:02
25F:→ LPH66: 倒是没这麽思考过; 稍微想一想应该是可以的 10/02 08:02
26F:→ LPH66: 这样 * 这个 type function 确实能说是 covariant 10/02 08:03
27F:推 Killercat: 其实我觉得你想到这case已经满厉害的了 XD 10/02 23:58
28F:→ Killercat: 写一辈子c++都没想过衔尾蛇 10/02 23:58







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP