C_and_CPP 板


LINE

dynamic_cast跟static_cast 對於下轉的差異我基本上了解 但是 基於這個 http://tinyurl.com/y49guge8 https://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-pro-type-static-cast-downcast.html 我看到同事因為這樣而把所有static_cast 全部改成dynamic_cast 導致必須加上 try catch(){ 這邊還補上了assert(false) 強調這件事不該發生} 我想問的是 既然static_cast就是對於下轉 不安全 1. 我有什麼情況下該用(較好)static 而不是dynamic_cast呢? 如果有安全的我幹嘛要用static_cast? 想知道有什麼理由反倒static_cast是更被接受的 https://ideone.com/vam3fi 2. 實際在寫產品的時候 什麼時候"不會" 把base class的 解構子 加上 virtual? 我不能阻止寫code的人 一定不能寫Base* = Derived; 所以一定會補上virtual destructor 來有備無患 但這樣變成 只要不是final class 我解構子都該冠上virtual? 謝謝 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 27.52.3.23
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1551021569.A.F0C.html
1F:→ loveme00835: 1. 差別在於需不需要 RTTI, 你要放 ref type 在角括 02/24 23:38
2F:→ loveme00835: 裡, 當然就要加上 try-catch, 但指標轉型只要檢查回 02/24 23:39
3F:→ loveme00835: 傳是不是 nullptr. 2. 你的 class "可以當" base 的 02/24 23:41
4F:→ loveme00835: 時候, 就會透過 virtual dtor 和使用者講這件事, 不 02/24 23:41
5F:→ loveme00835: 然頂多只能當 private base, 這算是一個協定, 懶得寫 02/24 23:42
6F:→ loveme00835: 空的 virtual dtor 就用 = default 02/24 23:42
7F:→ loveme00835: 除非是想透過 dynamic polymorphism 來擴充功能, 這 02/24 23:44
8F:→ loveme00835: 意味著你的 base 裡有 pure virtual function, 不然 02/24 23:45
9F:→ loveme00835: 不太需要這樣寫 02/24 23:46
10F:→ loveme00835: 另外講一個設計問題, 通常 dynamic_cast 變多表示你 02/24 23:56
11F:→ loveme00835: 的設計需要再重新檢視一下, 常見的現象是新增一個類 02/24 23:57
12F:→ loveme00835: 別要改好多地方, 而這些地方都用了 dynamic_cast 02/24 23:57
13F:→ loveme00835: static_cast 和 dynamic_cast 有各自的角色, 你會取 02/25 00:00
14F:→ loveme00835: 捨表示還不清楚界線在哪 02/25 00:00
15F:→ bluesoul: 只要有多型就該用dynamic cast 02/25 09:09
16F:→ bluesoul: 2的話,簡單說是,都加,不然就是用final 02/25 09:09
17F:→ lovejomi: @loveme: 1. 我比較不懂的是 static_cast不安全 02/25 22:27
18F:→ lovejomi: 既然有安全的 為什麼不用(就算有RTTI又怎樣?) 02/25 22:27
19F:→ lovejomi: 我知道好像可以compile option disable RTTI 但如果 02/25 22:27
20F:→ lovejomi: enable的情況下, 會想刻意不用RTTI嗎? 02/25 22:28
21F:→ lovejomi: 順帶一問 實務上auto&& = xx; 什麼時候會用auto&&? 02/25 22:29
22F:→ lovejomi: 目前想不到use case 02/25 22:29
23F:→ loveme00835: 所謂的「不安全」指的是「你以爲你知道你在做什麼; 02/25 22:57
24F:→ loveme00835: 實際上卻不是」,而不是「某些東西就是禁忌,用了就 02/25 22:57
25F:→ loveme00835: 是不對」。舉個例子如 LLVM 的 RTTI。auto&& 使用的 02/25 22:57
26F:→ loveme00835: 情境有兩種:作為 r-value ref 或是 forwarding ref, 02/25 22:57
27F:→ loveme00835: 前者用來延長物件 lifetime, 後者保留 arg 值的類型 02/25 22:57
28F:→ loveme00835: 簡單說在你熟悉語言特性以前,寫的每一行都可能不安 02/25 23:15
29F:→ loveme00835: 全 02/25 23:15
30F:推 steve1012: rtti 比較expensive. 然後code裡面一堆dynamic cast 02/26 06:39
31F:→ steve1012: 的確代表你的設計可能很有問題 02/26 06:39
32F:→ loveme00835: 更正: auto&& 都會用於推導型別, 沒有特指 r-value 02/26 09:04
33F:→ loveme00835: 的情形 02/26 09:04
34F:→ lovejomi: auto&&會怎麼樣我很清楚 但我發現沒有使用他的情境 才 02/26 09:33
35F:→ lovejomi: 請教再下一篇 02/26 09:33
36F:→ lovejomi: 想知道有什麼情境用他是最好的 @@ 02/26 09:34
37F:→ lovejomi: 另外clang tidy因為有warning,所以再想到底該不該修正 02/26 09:43
38F:→ lovejomi: 這些東西 02/26 09:43
39F:→ lovejomi: clang應該跟你說的llvm rtti有關係吧 02/26 09:44







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP