为什么在C ++中,一个类的指针可以被转换为另一个类的指针?

时间:2014-07-04 05:01:38

标签: c++ pointers casting

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;不会抛出编译时错误来转换不相关类型的指针。

2 个答案:

答案 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_castdynamic_cast或其亲属。有关详细信息,请参阅相关问题When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

您可以使用选项-Wold-style-cast强制GCC向这些演员表示警告。要将所有警告转换为错误,您可以添加选项-Werror