[問題] 關於類型轉換

看板C_and_CPP作者 (Jay)時間3年前 (2020/08/03 22:24), 3年前編輯推噓3(308)
留言11則, 4人參與, 3年前最新討論串1/1
開發平台(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

08/04 01:27, 3年前 , 1F
這個叫做 sidecast, 就是如你這樣有個子類繼承兩個父類時
08/04 01:27, 1F

08/04 01:27, 3年前 , 2F
其中一邊的父類指標若指向這個子類物件則可以如此轉成
08/04 01:27, 2F

08/04 01:27, 3年前 , 3F
另一邊的父類指標
08/04 01:27, 3F

08/04 01:29, 3年前 , 4F
注意到這得要真的指向這子類物件才能轉, 不然 dynamic_cast
08/04 01:29, 4F

08/04 01:29, 3年前 , 5F
會失敗 (回傳 nullptr)
08/04 01:29, 5F

08/04 15:40, 3年前 , 6F
補充兩點 dynamic_cast沒有階層關係 純粹就是看meta有
08/04 15:40, 6F

08/04 15:40, 3年前 , 7F
沒有該class當parent,這就衍生出第二點:沒開RTTI會炸
08/04 15:40, 7F

08/04 15:41, 3年前 , 8F
所以你這轉法基本上沒問題 然後通常RTTI預設是開啟
08/04 15:41, 8F

08/04 16:55, 3年前 , 9F
這行為不是跟c#繼承兩個interface一樣嗎? dynamic_cast
08/04 16:55, 9F

08/04 16:55, 3年前 , 10F
後要if判斷是不是nullptr,確保轉型成功
08/04 16:55, 10F

08/04 18:16, 3年前 , 11F
用法沒錯 但要檢查回傳是不是null
08/04 18:16, 11F
謝謝各位前輩解惑 後續我會加上判斷 ※ 編輯: asdfg1597860 (42.74.49.3 臺灣), 08/04/2020 23:34:03
文章代碼(AID): #1VA1u2lx (C_and_CPP)