看板 C_and_CPP 關於我們 聯絡資訊
大家好 目前再用一套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
damody:沒記錯的話 這邊不用星號 dynamic_cast<C> 07/17 13:57
damody:我錯了 別試 07/17 14:46
damody:用 refence 試試 C& c = dynamic_cast<C&>(*a); 07/17 15:01
descent:"用小程式驗證 都沒有這個問題" 是什麼意思? 07/17 15:23
azureblaze:RTTI沒開? 07/17 15:30
Fenikso:當繼承樹很亂的時候有可能會出現ambigious cast 07/17 15:52
Fenikso:ex: http://ideone.com/21laCQ 07/17 15:52
hilorrk:有點好奇是什麼規則@@ 可以給點提示嗎? 07/17 17:53
QQ29:就用乾淨的專案來驗證轉型 都沒失敗~ 07/17 19:53
QQ29:但用這個library 的class在我的程式就會出問題@@ 07/17 19:53
LenaPark:RTTI沒開+1, 至少我用vs2012是遇到這樣 07/17 20:59
QQ29:可是B轉C就可以耶 應該是有開呀 07/17 21:36
purpose:大概的關係,只是一個很含糊的繼承關係,想必不是真的等價 07/17 22:23
purpose:也不是真的可以簡化成原文的 ABC 例子。模擬兩可是有可能 07/17 22:24
QQ29:可是若真的某種寫法會讓dynamic cast不穩 這不是很詭異嗎? 07/17 23:13
purpose:如果你的不穩問題,是出自樓上 Fenikso 大的程式碼那種 07/18 00:18
purpose:多重繼承,那只能怪你自己。dynamic_cast 文件應該會告訴 07/18 00:19
purpose:你正確的做法,比如改成這樣 http://ideone.com/yUFRTW 07/18 00:19
freaky:這個問題關鍵點就在virtual inheritance 07/18 01:13
damody:問一下原po的編譯器是? library 用的編譯器是? 07/18 03:05
freaky:如果class A沒有virtual function也無法使用dynamic_cast 07/18 04:10
descent:有那個 library source 或是名稱 07/18 08:08