使用 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_cast
到 Derived*
:
Base2* instance2 = dynamic_cast<Derived*>(instance1);
(或者 static_cast
如果您 知道 *instance1
实际上是一个 Derived
,并且您不希望动态调度开销.虽然不推荐。)
reinterpret_cast
不知道如何处理兄弟姐妹之间的转换(例如在 vtable 实现中它不会修复 this
指针)所以它肯定不会工作。请注意,它可能看起来 做您期望的事情。在这种情况下,您需要使用 dynamic_cast
,或者 static_cast
来派生并使用隐式转换为 base2
.
下面的代码有没有问题?特别是我对 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_cast
到 Derived*
:
Base2* instance2 = dynamic_cast<Derived*>(instance1);
(或者 static_cast
如果您 知道 *instance1
实际上是一个 Derived
,并且您不希望动态调度开销.虽然不推荐。)
reinterpret_cast
不知道如何处理兄弟姐妹之间的转换(例如在 vtable 实现中它不会修复 this
指针)所以它肯定不会工作。请注意,它可能看起来 做您期望的事情。在这种情况下,您需要使用 dynamic_cast
,或者 static_cast
来派生并使用隐式转换为 base2
.