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/cn.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灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP