我知道static_cast是从一种类型到另一种类型的转换,(直觉上)是一种转换,在某些情况下可以成功,并且在没有危险转换的情况下也很有意义。同时,reinterpret_cast是表示不安全转换的强制转换,该转换可能会将一个值的位重新解释为另一值的位。

有人可以描述一种情况,在这种情况下,代码将被编译,强制转换并且static_cast不会引起问题,但是对于reinterpret_cast来说会存在问题?

最佳答案

这样可以做到:

#include <iostream>
using namespace std;

struct C{int n;};
struct A{int n;};
struct B : A, C{};

int main()
{
    B b;
    B* pb = &b;
    cout << static_cast<C*>(pb) << "\n";
    cout << reinterpret_cast<C*>(pb);
}

请注意两个地址的差异。

我在这里建立了一些多重继承,并在基类中放置了一个显式成员,以规避可能将空基类的大小优化为零。

参见https://ideone.com/QLvBku

10-08 09:39
查看更多