无法将子类强制转换为父类

时间:2018-04-27 08:54:19

标签: c++

我正在处理一个处理继承的类项目。我有一个名为Circle的类,它继承自一个名为Shape的类。当我尝试将Shape转换为圆形时,我会遇到错误。

形状类看起来像这样

class Shape {
    public:
    Point center;
    string type;
    virtual int area();
};

像这样的圈子类

class Circle : public Shape {
    public:
    int radius;
    Circle(int x, int y, int r) {
        type = "circle";
        center.x = x;
        center.y = y;
        radius = r;
    }
};

我的代码看起来像这样

int main() {

    std::vector<Shape> shapes;

    Circle c(0, 1, 5);
    shapes.push_back(c);

    for (int i = 0; i < shapes.size(); i++) {
        if (shapes[i].type == "circle") {
            Circle c = (Circle)shapes[i]; // <-- Error line
        }
    }

我不能把形状重新塑造成一个圆圈,但我知道这是一个圆圈。

error: no viable conversion from 'std::__1::__vector_base<Shape, std::__1::allocator<Shape> >::value_type' (aka 'Shape') to 'Circle'

我做错了什么?有没有办法强制转换?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

继承是&#34;是-a&#34;关系,但它是单向关系。 Circle&#34; is-a&#34; Shape,但Shape 不是<{1}}。Circle。这就是你无法施展的原因。

要使转换工作(并且没有切片),您需要使用指针

std::vector<Shape*> shapes;
shapes.push_back(new Circle(0, 1, 5));
...
Circle* c = static_cast<Circle*>(shapes[i]);

虽然我使用标准的非拥有指针显示上述示例,但您应该考虑使用智能指针,例如std::unique_ptrstd::shared_ptr