C++ 动态\u将对象强制转换为同一类型

C++ 动态\u将对象强制转换为同一类型,c++,dynamic-cast,C++,Dynamic Cast,我正在编写一些遗留代码,其中有几行代码如下: try { object = dynamic_cast< Object* >( _object ); } 试试看 { 对象=动态\u投射(\u对象); } 其中\u对象已经是一个对象*。代码中有一条注释,说明如果\u object已被释放,则尝试避免崩溃。我的问题是,这是如何工作的,如果是的话?如果开始和结束类型相同,dynamic_cast是否仍有作用 还有另一个地方,他们正在做相同的动态\u cast,但它不在try块中。

我正在编写一些遗留代码,其中有几行代码如下:

try
{
    object = dynamic_cast< Object* >( _object );
}
试试看
{
对象=动态\u投射(\u对象);
}
其中
\u对象
已经是一个
对象*
。代码中有一条注释,说明如果
\u object
已被释放,则尝试避免崩溃。我的问题是,这是如何工作的,如果是的话?如果开始和结束类型相同,
dynamic_cast
是否仍有作用

还有另一个地方,他们正在做相同的
动态\u cast
,但它不在try块中。是否存在指向同一确切类型的动态强制转换的点,或者这可能只是“坏”代码

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

它没有,至少没有以任何明确的方式。试图对一个被破坏的非平凡对象执行任何操作都会产生未定义的行为

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

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

如果开始和结束类型相同,
dynamic_cast
是否仍有作用

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

是否存在指向同一确切类型的动态强制转换的点,或者这可能只是“坏”代码


不,没有意义。指针已经指向正确类型的有效对象,在这种情况下,您可以直接使用它;或者它没有,在这种情况下,
dynamic\u-cast
是未定义的。

dynamic\u-cast通常会在尝试转换的对象被释放时抛出异常。这可能就是他们所说的“避免撞车”的意思

我想他们把它扔到了一个试块里,因为它之前已经崩溃了,他们不想弄清楚它为什么会在这里崩溃

也没有理由动态强制转换到相同的确切类型,除非您试图向变量添加constness(我认为const是一个说明符,而不是类型的一部分)