首页 > 解决方案 > 如果我已经检查了 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 ∗&gt;(p) ;
s−&gt;studeer();
}
else p−&gt;doe();
}

标签: c++castingdynamic-caststatic-cast

解决方案


您可以删除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.


推荐阅读