c++ - 如果我已经检查了 typeid,为什么不使用 static_cast 而不是 dynamic_cast?
问题描述
下面的代码检查p
指针中的对象是否来自 type Student
,如果是这种情况,则执行dynamic_cast。
但是为什么我们不能做一个 static_cast 呢?
我假设强制转换是安全的,因为我们检查了指针中的对象是否来自正确的类型,并且static_cast更快。
void testRTTI (Persoon ∗p){
if (strstr (type id (∗p).name(), "Student")!=NULL){
Student ∗ s = dynamic_cast<Student ∗>(p) ;
s−>studeer();
}
else p−>doe();
}
解决方案
您可以删除typeid
检查,只检查是否dynamic_cast
返回nullptr
:
void testRTTI (Persoon *p){
if (Student * s = dynamic_cast<Student *>(p); s != nullptr){
s->studeer();
} else {
p->doe();
}
}
我认为您对指针的动态转换功能存在误解。因为dynamic_cast<T*>
它将首先检查传递给的指针是否dynamic_cast<T*>
可以以有效的方式转换为T*
. 这个测试并不比你的贵typeid(*p).name()
(至少对于给定的情况来说不是),而且肯定比你便宜strstr(typeid(*p).name(), "Student")!=NULL
。
如果它不能被强制转换T*
,它将返回nullptr
,如果它可以被强制转换,它将返回相同的指针,T*
它根本不需要是一个操作。
因此,您的代码会进行两项检查,一项与您有关typeid
,一项在dynamic_cast
.
推荐阅读
- ssl - 任意子子域
- tfs - 如何在 TFS 测试用例中以符号 (@) 转义?
- android - Flutter 仅在三星 S9 设备上崩溃
- java - Java-Synchronized String 导致干扰
- html - 为什么 justify-content center 不能正常工作?
- python - 使用 Pandas 和日期时间格式绘图
- javascript - 为什么我的 HTML 元素不能留在页面底部?
- javascript - 导航到 SPA 上的不同页面时是否应该销毁 JSON 对象
- java - 在此时间窗口中检测到内存耗尽的早期症状
- rust - 如何提示用户在 CLI 工具中输入,同时能够将工具的输出通过管道传输到另一个程序?