使用 reinterpret_cast

Use of reinterpret_cast

下面的代码有没有问题?特别是我对 reinterpret_cast.

的使用感兴趣
class Base1
{
public:
    virtual void foo(){}
};

class Base2
{
public:
    virtual void bar(){}
};

class Derived : public Base1, public Base2
{
};

int main()
{
    Base1* instance1 = new Derived();
    instance1->foo();

    Base2* instance2 = reinterpret_cast<Base2*>(instance1);
    instance2->bar();

    return 0;
}

在这种情况下,首选简单的 dynamic_castDerived*

Base2* instance2 = dynamic_cast<Derived*>(instance1);

(或者 static_cast 如果您 知道 *instance1 实际上是一个 Derived,并且您不希望动态调度开销.虽然不推荐。)

reinterpret_cast 不知道如何处理兄弟姐妹之间的转换(例如在 vtable 实现中它不会修复 this 指针)所以它肯定不会工作。请注意,它可能看起来 做您期望的事情。在这种情况下,您需要使用 dynamic_cast,或者 static_cast 来派生并使用隐式转换为 base2.