我正在处理一个处理继承的类项目。我有一个名为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'
我做错了什么?有没有办法强制转换?
感谢您的帮助。
答案 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_ptr
或std::shared_ptr
。