Dynamic_cast对象为相同类型

时间:2015-05-27 13:30:00

标签: c++ dynamic-cast

我正在处理一些遗留代码,这些代码有几行代码:

try
{
    object = dynamic_cast< Object* >( _object );
}

_object已经开始Object*。如果_object已被释放,代码中有关于尝试避免崩溃的评论。我的问题是,如果有的话,这是如何工作的?如果开始和结束类型相同,dynamic_cast是否仍会执行某些操作?

还有另一个地方,他们正在做同样的dynamic_cast,但它不在try块中。对于相同的确切类型的动态转换是否有任何意义,或者可能只是“坏”&#34;码?

2 个答案:

答案 0 :(得分:5)

  

我的问题是,如果有的话,这是如何工作的?

它没有,至少没有任何明确定义的方式。尝试使用被破坏的非平凡对象做任何事情会产生不确定的行为。

在某些特定的实现中,如果对象被破坏,则强制转换可能会彻底失败。但它很可能会崩溃或订购比萨饼。

有多种方法可以确保对象在使用前有效 - 例如智能指针或结​​构良好的范围 - 但是测试对象本身(无论是通过RTTI还是用户声明的成员数据)将无法工作,因为破坏后无法安全访问对象。

  

如果起始和结束类型相同,dynamic_cast是否仍会执行某些操作?

它可能什么都不做,因为它可以假设指针有效,因此转换将成功。或者它可能会进行运行时类型检查,如果指针有效则会成功,否则会给出未定义的行为。

  

对于相同的确切类型,动态转换是否有任何意义,或者可能只是“坏”代码?

不,没有意义。指针已经指向正确类型的有效对象,在这种情况下你可以使用它;或者它没有,在这种情况下dynamic_cast未定义。

答案 1 :(得分:1)

如果已经释放了它正在尝试强制转换的对象,那么

dynamic_cast通常会抛出异常。这可能是他们所说的&#34;避免崩溃&#34;

我认为他们在试用版块中抛出它,因为它之前崩溃了,而且他们并不想弄清楚它为什么会在这里崩溃。

除非你试图将constness添加到变量中,否则没有理由将动态强制转换为相同的类型(认为const是一个说明符而不是我想象的类型的一部分)。