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/m.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燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP