在什么情况下可以reinterpret_cast
使用从实际上是派生实例指针的基指针进行转换?(通过多态性)。
如果继承是多态的,则静态强制转换不起作用。
我考虑了这个微不足道的场景:
class A
{
public:
virtual void Hello()
{
cout<<" A ";
}
virtual int GetType() { return 1; }
};
class B: public A
{
public:
void Hello()
{
cout<< " B ";
}
void Do()
{
cout << " Another method of B";
}
int GetType() { return 2;}
};
/// ... sample/test code
A* a1 = new A();
A* b1 = new B();
A* a2;
B* b2;
if (a1->GetType() == 1)
{
a2 = a1;
a2->Hello();
}
else
if (a1->GetType() == 2)
{
b2 = reinterpret_cast<B*>(a1);
b2->Do();
b2->Hello();
}
请注意非常幼稚的“伪类型识别方法” GetType()
,我曾经决定是否可以转换它们。出于这种目的,使用 reinterpret_casts 是否完全错误,以避免 dynamic_casts?(即它是一种偏执的设计,本质上是危险的并且不太灵活会引入不必要的麻烦?执行正常的动态转换是否更安全且值得付出较小的性能成本?我知道多重继承和/或虚拟继承会弄乱任何其他转换操作,除了多态/动态的)。