【发布时间】:2014-07-14 18:40:40
【问题描述】:
我一直在试验指针,写了如下代码:
#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*?任何指针都可以转换成其他指针吗?
【问题讨论】:
-
即使你的编译器什么也没说(因为显式转换意味着“我知道潜在的问题,不要警告我”),你在做什么也是完全错误的。它给出了预期的结果是巧合(因为 a 和 c 具有相同的字节偏移并且在 A 和 B 中键入)
-
任何类型的指针都可以转换为任何其他类型是不完全正确的。但它可以转换为比应有的类型更多的类型。
-
@Beta 你能提供合适的例子吗?
-
该语言允许您将指向任何事物的指针转换为指向(大部分)其他事物的指针。除非在少数有限的情况下,否则无法安全地使用结果。
-
c-style cast
(A*)是一把大锤。使用static_cast<A*>让编译器检查您的类型是否相关。 @mark-b 也许这被关闭得太快了:-/ ...