【发布时间】:2014-07-04 05:01:38
【问题描述】:
class A
{
public:
void display()
{
cout << "class A\n";
}
};
class B
{
public:
void show()
{
cout << "class B\n";
}
};
int main()
{
A* aPtr = new A;
B* bPtr = new B;
B* bPtr2 = (B*) aPtr;
return 0;
}
在上面的代码中,为什么在 C++ 中允许将一个类类型的指针转换为另一个类类型。由于这两个类仍然不相关,为什么B* bPtr2 = (B*) aPtr; 不会抛出编译时错误来转换不相关类型的指针。
【问题讨论】:
-
这是一个 C 风格的转换,编译器假定你知道你在做什么......尝试
static_cast或dynamic_cast看看会发生什么。 -
但是你没有使用 C++,那些是 C 风格的转换。 C++有
static_cast、dynamic_cast、reinterpret_cast等类型转换操作符。 -
The C++ compiler should not allow valid C syntaxwat。 FWIW,您始终可以使用-Wold-style-cast进行编译 -
@Surfing_SO 有很多事情会导致未定义的行为,但不需要编译器给出错误。事情就是这样。部分原因是历史原因,但很多时候是出于实际原因。语言工具的存在是为了帮助您避免导致未定义的行为,在这种情况下是 C++ 风格的强制转换。但是如果你下定决心要朝自己的脚开枪,C++ 不提供铠甲靴。
-
如果 C++ 编译器不编译 C 风格的强制转换,就无法再使用 C++ 编译器编译 C 代码,并且 C++ 将失去其主要功能之一(而且他们将拥有将其重命名为其他名称;))