[問題] dynamic cast..

看板C_and_CPP作者 (我愛阿蓉)時間15年前 (2010/08/13 01:35), 編輯推噓1(1023)
留言24則, 4人參與, 最新討論串1/1
因為工作都沒碰C++ 怕忘光 剛看了幾篇 想回憶一下 dynamic cast #include <iostream> using namespace std; class A { public: virtual void QQ(){} }; class B:public A {public: virtual void QQ(){} }; int main() { A *obj = new A; B* p = dynamic_cast<B*>(obj); //????????????????????????????? system("PAUSE"); return 0; } 不是說會安全下轉嗎 照理講run起來應該出現exception或是什麼奇怪的訊息吧? 怎麼正常執行 請大家開釋一下~~thx~ ps.剛真的去invoke QQ這函式 才發出exception....所以他在轉型時不會檢查嗎? 還有想到~以前上遊戲設計時老師說什麼 開發人員不會也不該去用dynamic cast 但 原因我完全忘記了..... 請教一下各位 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.70.221 ※ 編輯: QQ29 來自: 123.192.70.221 (08/13 01:39)

08/13 01:38, , 1F
會變成 NULL
08/13 01:38, 1F

08/13 01:39, , 2F
改成B b=dynamic_cast<B>(*obj)會有bad_cast exception
08/13 01:39, 2F

08/13 01:40, , 3F
喔喔想起來了 dynamic cast失敗會return null而不是exception
08/13 01:40, 3F

08/13 01:40, , 4F
所謂的安全是建立在你有檢查 cast 結果的前提下。
08/13 01:40, 4F

08/13 01:41, , 5F
二樓的 <> 裡面應該是 B & 吧,ref 就會丟 exception。
08/13 01:41, 5F

08/13 01:42, , 6F
我不知道有幾年沒寫到 dynamic_cast 了。
08/13 01:42, 6F

08/13 01:42, , 7F
對耶,筆誤
08/13 01:42, 7F

08/13 01:44, , 8F
至於 invoke 下去才會發出 exception,我想那不是 C++ 的
08/13 01:44, 8F

08/13 01:44, , 9F
exception,應該是 OS 丟出來的。
08/13 01:44, 9F

08/13 01:44, , 10F
至於那個算不算 exception,要問熟 Windows 的。
08/13 01:44, 10F

08/13 01:45, , 11F
null->QQ();這樣是OS丟出來的唷!?
08/13 01:45, 11F

08/13 01:45, , 12F
B &b=dynamic_cast<B&>(*obj); 請教如果改這樣 f大寫的 B b=
08/13 01:45, 12F

08/13 01:46, , 13F
差異在哪裡阿 我實在不懂為啥一定要轉成ref再做assign
08/13 01:46, 13F

08/13 01:46, , 14F
為了通過dynamic_cast語法的規定嗎?
08/13 01:46, 14F

08/13 02:03, , 15F
null-> 這個是 OS 丟出來的沒錯啊 不合法記憶體存取
08/13 02:03, 15F

08/13 02:55, , 16F
dynamic_cast<T>, T必須為pointer或reference
08/13 02:55, 16F

08/13 02:56, , 17F
你可以用 B b = dynamic_cast<B&>(*obj);
08/13 02:56, 17F

08/13 13:34, , 18F
所以是為了滿足dynamic cast的語法嗎?
08/13 13:34, 18F

08/13 13:39, , 19F
雖然不明白你所謂滿足語法的意義是什麼,不過...
08/13 13:39, 19F

08/13 13:39, , 20F
C++ 的多型機制只會作用在 pointer 跟 reference 上。
08/13 13:39, 20F

08/13 13:40, , 21F
用 by value 傳遞只會造成物件被切割。
08/13 13:40, 21F

08/13 13:40, , 22F
另外因為 reference 不能重新指向其它東西,
08/13 13:40, 22F

08/13 13:41, , 23F
也不能指向無物,所以為了表示轉型失敗,才用 exception。
08/13 13:41, 23F

08/13 13:41, , 24F
pointer 就沒這問題,所以轉型失敗可以直接傳回 0 表示。
08/13 13:41, 24F
文章代碼(AID): #1CP33Ql8 (C_and_CPP)