看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) win10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) vs2015 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): dynamic_cast的使用 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) Class Basic { Public : Virtual int A() {return 0;} } Class Basic2 { Public: Virtual int B(){return 0;} } Class Derived : public Basic , public Basic2 { int A() override; int B() override; } Basic* pa = new Derived(); Basic2* pb = dynamic_cast<Basic2*>(pa); 補充說明(Supplement): 想請問各位前輩 這樣使用dynamic_cast 是否錯誤 雖然在程式中可以執行,也沒發生錯誤 但與我在網路上查到的用法有些不同 有疑問的點是pa 是 父類別指標 ,同樣的pb也是父類別指標 如此一來就沒有上對下的類型轉換 再麻煩各位前輩排解我的疑惑 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.40.199.201 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1596464642.A.BFB.html
LPH66: 這個叫做 sidecast, 就是如你這樣有個子類繼承兩個父類時08/04 01:27
LPH66: 其中一邊的父類指標若指向這個子類物件則可以如此轉成08/04 01:27
LPH66: 另一邊的父類指標08/04 01:27
LPH66: 注意到這得要真的指向這子類物件才能轉, 不然 dynamic_cast08/04 01:29
LPH66: 會失敗 (回傳 nullptr)08/04 01:29
Killercat: 補充兩點 dynamic_cast沒有階層關係 純粹就是看meta有08/04 15:40
Killercat: 沒有該class當parent,這就衍生出第二點:沒開RTTI會炸08/04 15:40
Killercat: 所以你這轉法基本上沒問題 然後通常RTTI預設是開啟08/04 15:41
s4300026: 這行為不是跟c#繼承兩個interface一樣嗎? dynamic_cast08/04 16:55
s4300026: 後要if判斷是不是nullptr,確保轉型成功08/04 16:55
HMKRL: 用法沒錯 但要檢查回傳是不是null08/04 18:16
謝謝各位前輩解惑 後續我會加上判斷 ※ 編輯: asdfg1597860 (42.74.49.3 臺灣), 08/04/2020 23:34:03