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

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

下面的代码检查来自 p 指针的对象是否来自类型 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

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

在两个方面存在缺陷。

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

  2. 忽略第一个问题:如果您有另一个类,其中 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 至少有一个虚函数时有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?