[問題] 關於類型轉換

作者: asdfg1597860 (Jay)   2020-08-03 22:24:00
開發平台(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也是父類別指標
如此一來就沒有上對下的類型轉換
再麻煩各位前輩排解我的疑惑
作者: LPH66 (-6.2598534e+18f)   2020-08-04 01:27:00
這個叫做 sidecast, 就是如你這樣有個子類繼承兩個父類時其中一邊的父類指標若指向這個子類物件則可以如此轉成另一邊的父類指標注意到這得要真的指向這子類物件才能轉, 不然 dynamic_cast會失敗 (回傳 nullptr)
作者: Killercat (殺人貓™)   2020-08-04 15:40:00
補充兩點 dynamic_cast沒有階層關係 純粹就是看meta有沒有該class當parent,這就衍生出第二點:沒開RTTI會炸所以你這轉法基本上沒問題 然後通常RTTI預設是開啟
作者: s4300026 (s4300026)   2020-08-04 16:55:00
這行為不是跟c#繼承兩個interface一樣嗎? dynamic_cast後要if判斷是不是nullptr,確保轉型成功
作者: HMKRL (HMKRL)   2020-08-04 18:16:00
用法沒錯 但要檢查回傳是不是null

Links booklink

Contact Us: admin [ a t ] ucptt.com