为什么我可以无错误地编译无关类的指针?

时间:2014-07-14 18:40:40

标签: c++ pointers casting

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

#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*?可以将任何指针转换为任何其他指针吗?

1 个答案:

答案 0 :(得分:1)

  

&#34;是否可以将任何指针转换为任何其他指针?&#34;

如果你使用这样的c风格演员,是的。

a = (A*)b; 

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

a = reinterpret_cast<A*>(b);

通过一致性,您从这些演员阵容中获得的经验不太可能符合预期。
换句话说:您将经历各种未定义的行为,在进行此类演员后访问a的任何成员。


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

a = static_cast<A*>(b); 

检查这些在线示例,了解static_cast<>reinterpret_cast<>的差异。