为什么我可以转换不相关类的指针而不会出错?



我一直在尝试使用指针,并编写了以下代码:

#include <iostream>
using std::cout;
struct A
{
    int a;
    char b;
    A(){ a = 4; }
};
struct B
{
    int c;
    B(){ c = 5; }
};
A *a = new A;
B *b = new B;
int main()
{ 
    a = (A*)b; 
    cout << a -> a; //5
}

为什么B*可以转化为A* ?可以将任何指针转换为任何其他指针吗?

"一个指针可以转换成另一个指针吗?"

如果你像这样使用c风格的强制转换,可以。

a = (A*)b; 

b指向的结构将被(重新)解释,就像它是A一样。正确的c++等效符是

a = reinterpret_cast<A*>(b);

通过一致性的方式从这样的强制转换中得到的体验不太可能符合预期。
换句话说:您将体验各种未定义行为,在执行此类强制转换后访问a的任何成员。


应该使用static_cast<>让编译器检查这些类型是否相关,并且可以以某种方式合理地转换

a = static_cast<A*>(b); 

查看这些在线样本,看看static_cast<>reinterpret_cast<>的差异

最新更新