繁体   English   中英

如果我已经检查了 typeid,为什么不使用 static_cast 而不是 dynamic_cast?

[英]Why not use static_cast instead of dynamic_cast if I already checked the typeid?

下面的代码检查来自p指针的 object 是否来自Student类型,如果是这种情况,则执行dynamic_cast

但是为什么我们不能做一个 static_cast 呢?

我认为强制转换是安全的,因为我们检查了指针中的 object 是否来自正确的类型,并且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

if (strstr(typeid (∗p).name(), "Student")!=NULL)

有两个方面的缺陷。

  1. function name()返回一个实现定义的值,没有任何保证。 该值可能会从一次运行更改为另一次运行,并且可能是随机字符串。

  2. 忽略第一个问题:如果您有另一个 class 其中typeid(...).name()将返回一个还包含"Student"的字符串怎么办?


这就是为什么你有dynamic_cast

Student ∗ maybeAStudent = dynamic_cast<Student ∗>(p);

if(maybeAStudent != nullptr)
{ /* p is a Student, do student things*/ }
else 
{ /* p is another Person, do person things */}

注意: dynamic_cast仅在Person至少有一个虚拟 function 时才有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM