作者asdfg1597860 (Jay)
看板C_and_CPP
標題[問題] 關於類型轉換
時間Mon Aug 3 22:24:00 2020
開發平台(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