【发布时间】:2015-12-09 06:21:48
【问题描述】:
我目前有一个名为 Shape 的基类,我创建了一个纯虚函数。
class Shape
{
protected:
float area;
float perimeter;
public:
virtual float calcArea() = 0;
virtual float calcPerimeter() = 0;
virtual void printArea() = 0;
virtual void printPerimeter() = 0;
};
我创建了两个这样的类
class Circle : public Shape
{
public:
Circle(float x);
~Circle();
float calcPerimeter();
float calcArea();
void printPerimeter();
void printArea();
private:
float radius;
};
和
class Square : public Shape
{
public:
Square(float x);
~Square();
float calcPerimeter();
float calcArea();
void printPerimeter();
void printArea();
private:
float length;
};
但是,当我尝试创建 Shape 类型的向量时,它说无法实例化虚拟对象“Shape 无法实例化抽象类”
std::vector<Shape> shapeVector;
我实际上并没有创建一个“对象”,因为我只是创建了一个形状类型的向量并添加了圆形和方形。那么为什么这不起作用呢?我知道如果我让 Shape 不是我可以继承的纯虚拟类。
我的逻辑是,我没有理由实例化一个“Shape”类型的类,所以我将它设为纯虚拟,但我仍然想使用 Shape 向量来存储我的派生类。
这里有完整的主要功能
Square square(3);
Circle circle(5);
square.calcArea();
square.calcPerimeter();
circle.calcArea();
circle.calcPerimeter();
std::vector<Shape> shapeVector;
shapeVector.push_back(square);
shapeVector.push_back(circle);
for (int i = 0; shapeVector.size(); i++) {
shapeVector[i].printArea();
shapeVector[i].printPerimeter();
}
【问题讨论】:
-
您可以将您的问题简化为一个更简单的示例(这也不起作用):这就像尝试拥有
Shape s = Square(3);。如果您了解该示例以及其中的所有问题,那么您也就了解了向量。
标签: c++ inheritance