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;
不会抛出编译时错误来转换不相关类型的指针。
答案 0 :(得分:6)
C cast语法将根据所涉及的类型执行不同的操作。它可以做的一件事是reinterpret_cast
。
这是你不应该使用C cast语法的原因之一,而是坚持使用C ++强制转换。使用C ++转换,您可以获得所要求的操作,而不是其他内容。
c ++编译器不应该允许这样做,并且应该抛出编译时错误。
C兼容性是C ++成功的原因之一。 C不应该有这种'多态'强制转换语法,但它确实需要与C ++兼容。如果您正在编写新的C ++代码,则不应使用旧的语法。
在某些编译器上,您可以使用以下内容禁用C样式转换:-Werror=old-style-cast
。
答案 1 :(得分:1)
您展示的示例称为“不安全”或“未选中”演员,非常正确。它是与C向后兼容而继承的低级构造。您不应该在现代C ++代码中使用它。
进行演员表的正确方法是使用操作static_cast
,dynamic_cast
或其亲属。有关详细信息,请参阅相关问题When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?。
您可以使用选项-Wold-style-cast
强制GCC向这些演员表示警告。要将所有警告转换为错误,您可以添加选项-Werror
。