2017-03-28 34 views
1

当没有检查返回值为NULL时,是否有任何目的使用dynamic_cast?如果我正在查看代码库,并且将空值检查从返回值中省略,那么使用static_cast可能会如此吗?使用dynamic_cast而不用空值检查

A *a = dynamic_cast<A *>(b); 
foo(*a); //might as well have used a static_cast 

我读过所有的谷歌对此事得到,它似乎是检查空是唯一的原因,但我还没有看到任何人站出来说“不dynamic_cast的空检查浪费周期(RTTI可能导致代码膨胀)。“

编辑:如果在类型之间存在虚拟继承,那么static_cast将失败,其中dynamic_cast不会。就我而言,情况并非如此。

+0

如果new_type是指向某个类D的指针或引用,并且表达式的类型是指向其非虚拟基B的指针或引用,则static_cast将执行向下转换。 **如果B不明确,不可访问,或虚拟基地(或虚拟基地的基地)为D,则这种向下转换是不合格的**。这种static_cast不进行运行时检查,以确保对象的运行时类型实际上是D **,并且只有在通过其他方式保证此前提条件时才可以安全使用,例如实现静态多态性。[来源](http://en.cppreference.com/w/cpp/language/static_cast) –

回答

3

当没有检查返回值为NULL时,是否有任何目的使用dynamic_cast?

如果您确定类实例是另一种类型的类型实例,则不可检查nullptr。在这种情况下为什么不使用static_cast?当涉及虚拟继承时,您可能无法使用static_cast。可以在这个问题的答案中找到详细信息:Why can't static_cast be used to down-cast when virtual inheritance is involved?

+0

I看到。所以如果在'A'和'B'之间存在虚拟关系,那么'static_cast'会出现问题,而'dynamic_cast'会是正当的,对吗?在我的情况下,没有。 – Opux