[問題] dynamic cast 回傳null??

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間12年前 (2013/07/17 12:31), 編輯推噓7(7015)
留言22則, 9人參與, 最新討論串1/1
大家好 目前再用一套library 他class關係大概是 class A; class B : virtual public A class C : virtual public B 奇怪的事情是 A* ptr = new C; C* ptr2 = dynamic_cast<C*>(ptr); ptr2 一直都是null 而以我的知識只告訴我 只要真的是有繼承關係 轉型就該成功 安全下轉 奇怪的是 若改為 B* ptr = new C; B* ptr2 = dynamic_cast<B*>(ptr); ptr2就不會是null.... 我開始亂懷疑是不是virtual 繼承阿 或是A 爺爺 無法下轉成 雜交的孫子C 用小程式驗證 都沒有這個問題.... 所以請教各位 是不是有什麼情況 dynamic cast就算真有繼承關係還是會return null 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.163.58.205

07/17 13:57, , 1F
沒記錯的話 這邊不用星號 dynamic_cast<C>
07/17 13:57, 1F

07/17 14:46, , 2F
我錯了 別試
07/17 14:46, 2F

07/17 15:01, , 3F
用 refence 試試 C& c = dynamic_cast<C&>(*a);
07/17 15:01, 3F

07/17 15:23, , 4F
"用小程式驗證 都沒有這個問題" 是什麼意思?
07/17 15:23, 4F

07/17 15:30, , 5F
RTTI沒開?
07/17 15:30, 5F

07/17 15:52, , 6F
當繼承樹很亂的時候有可能會出現ambigious cast
07/17 15:52, 6F

07/17 15:52, , 7F
07/17 15:52, 7F

07/17 17:53, , 8F
有點好奇是什麼規則@@ 可以給點提示嗎?
07/17 17:53, 8F

07/17 19:53, , 9F
就用乾淨的專案來驗證轉型 都沒失敗~
07/17 19:53, 9F

07/17 19:53, , 10F
但用這個library 的class在我的程式就會出問題@@
07/17 19:53, 10F

07/17 20:59, , 11F
RTTI沒開+1, 至少我用vs2012是遇到這樣
07/17 20:59, 11F

07/17 21:36, , 12F
可是B轉C就可以耶 應該是有開呀
07/17 21:36, 12F

07/17 22:23, , 13F
大概的關係,只是一個很含糊的繼承關係,想必不是真的等價
07/17 22:23, 13F

07/17 22:24, , 14F
也不是真的可以簡化成原文的 ABC 例子。模擬兩可是有可能
07/17 22:24, 14F

07/17 23:13, , 15F
可是若真的某種寫法會讓dynamic cast不穩 這不是很詭異嗎?
07/17 23:13, 15F

07/18 00:18, , 16F
如果你的不穩問題,是出自樓上 Fenikso 大的程式碼那種
07/18 00:18, 16F

07/18 00:19, , 17F
多重繼承,那只能怪你自己。dynamic_cast 文件應該會告訴
07/18 00:19, 17F

07/18 00:19, , 18F
你正確的做法,比如改成這樣 http://ideone.com/yUFRTW
07/18 00:19, 18F

07/18 01:13, , 19F
這個問題關鍵點就在virtual inheritance
07/18 01:13, 19F

07/18 03:05, , 20F
問一下原po的編譯器是? library 用的編譯器是?
07/18 03:05, 20F

07/18 04:10, , 21F
如果class A沒有virtual function也無法使用dynamic_cast
07/18 04:10, 21F

07/18 08:08, , 22F
有那個 library source 或是名稱
07/18 08:08, 22F
文章代碼(AID): #1HvXuutO (C_and_CPP)
文章代碼(AID): #1HvXuutO (C_and_CPP)