為什麼說不要使用 dynamic cast,需要執行時確定型別資訊,說明設計有缺陷?

時間 2021-05-11 18:38:20

1樓:徐辰

dynamic_cast主要配合多繼承,用來從乙個繼承鏈cast到另外一條繼承鏈。

從OO的角度而言多繼承並不是乙個特別好的設計,C++之所以留這麼個後門,主要原因是C++支援多繼承,現實中的專案經常會使用多個第三方庫,會引入多個類繼承體系,而且C++並沒有提供組合的語法糖,用多繼承經常也是無可奈何的解決方案。

2樓:zpan

當你使用 dynamic_cast 時,等於是把型別檢查放到執行時去做了。然而實踐上,除了要寫動態載入的外掛程式時不得不去做執行時型別檢查,其他會用到 dynamic_cast 的情況很多都是可以通過改變類(型)的設計從而把執行時型別檢查改為編譯時型別檢查的,因此不使用 dynamic_cast 可以減少程式的 bug。

3樓:暮無井見鈴

補充:當初是你要擦除(用虛函式、繼承擦除型別),擦除就擦除。現在又要動態轉( dynamic_cast ),把它哄回來……

如其他答案所說,分別實現 GameObject::kill 和 GameObject::killedBy 看起來更好。

另外,如果 Player 和 Monster 就是最終派生類,那麼可以用 typeid(*pKiller) == typeid(Player) 這種方法判斷。

用 dynamic_cast 在繼承樹中轉換時,需要在整個繼承樹的元資訊中搜尋。往往有更快的方法取代它。

不過 dynamic_cast 不一定是在繼承樹中轉換。

void *pHead = dynamic_cast(pBase);

pBase->~Base();

al.deallocate(pHead);

這裡 dynamic_cast() 得到指向最終派生物件首位元組的指標。多繼承且要求非侵入式設計的情況下不得不用。

4樓:Tim Shen

dynamic_cast 「不OOP」。純OOP是用虛函式做dispatch的。當然我沒說非要OOP,只不過與其使用dynamic_cast,我更喜歡顯式新增型別成員(通常是乙個enum),然後switch(this->type_member), 或者更正式地使用Boost.

Variant。

5樓:「已登出」

沒必要盲從,在多重繼承下,就算知道乙個父類指標的真實型別,安全轉成子類也要用dynamic_cast,當然你自己計算指標偏移量除外,可能又有人說不該用多重繼承,呵呵,google的webrtc專案一堆的多重繼承怎麼說,不只多重繼承,2個毫無關係的型別強轉都用了,當然對外介面是友好的。

為什麼要使用 Evernote?

悶騷的劉大哥 1.記錄 梳理想法很方便,討厭新建word寫文件2.自動同步,這讓有網路的地方就有工作備份3.標籤的組織方式,讓人很容易養成總結 整理知識的好習慣現在工作中,可以不開QQ,不能不開evernote,因為有些梳理 想法 計畫,它都幫我記著。 我說說我的使用後的體驗 1.使用方法 網頁編輯...

為什麼要使用沖牙器?

魚圈圈圈圈圈兒 沖牙器又稱水牙線,跟牙線是乙個作用,目的是清理牙縫中的食物殘渣,每顆牙齒暴露在外有五個面需要清潔,但是牙刷能刷到的地方只有70 牙縫中的兩個面是刷不到的,沖牙器就是用來清理牙刷刷不到的地方的,可以預防齲齒 牙周炎等牙齒健康問題 雅克菱Yakelin 牙刷能清潔的區域不大。比如牙縫死角...

vue中為什麼要使用filter?

水秋玄 filter 是做一些統一的處理,比如轉大小寫,格式化時間 新增前字尾等等。用method也可以,但是使用按需混入太麻煩,自動全域性混入又沒必要,因為不是所有元件都用到。computed也可以用,但是computed實際是檢測所包含的的變數的改變,跟一般方法還是有區別,再者使用compute...