[英]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)
有两个方面的缺陷。
function name()
返回一个实现定义的值,没有任何保证。 该值可能会从一次运行更改为另一次运行,并且可能是随机字符串。
忽略第一个问题:如果您有另一个 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.