考虑以下代码:
class A {/*...*/};
class B : public A {/*...*/};
void func(A*const a)
{
B*const b = reinterpret_cast<B*const>(a);
b->do_something();
}
在一个大型项目中,发现了几个类似的地方。我知道这会导致未定义的行为。
我对以下问题特别感兴趣:
- 如果指针
a
总是指向 type 的对象B
,我们会有问题吗? - 如果指针
a
不指向 type 的对象B
,那又如何呢?
B*b=(B*)a
),但您如何保证这一点?...为了保证这一点,您应该使用它dynamic_cast
并进行结果检查。PS来自我个人-我真的不喜欢将祖先带到后代。我确信这表明一个糟糕的项目 - 粗略地说,当为了让汽车行驶时,用胶带将某些东西绑在它上面:)
PPS 有点
dynamic_cast
——虽然你的问题不是关于他的,所以如果这是多余的——对不起..A
通过隐式强制转换获得时,或者static_cast
指针指向B
但这些类不具有指针可互换属性,或者当通过获得指针reinterpret_cast
但对象具有不同的对齐方式时。https://godbolt.org/z/YNh9Zv