使用纯虚类创建向量(模板)

Using pure virtual classes to create vectors (template)

本文关键字:向量 模板 创建      更新时间:2023-10-16

我现在有一个叫做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;
};

然而,当我试图创建一个形状类型的向量时,它说虚拟对象无法实例化"形状不能实例化抽象类"

std::vector<Shape> shapeVector;

我实际上并没有创建一个"对象",因为我只是创建了一个类型为shape的矢量,并添加了Circle和Square。那么,为什么这不起作用呢?我意识到,如果我使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对象的矢量。由于您不能实例化Shape,这就是您得到错误的原因。你需要使用Shape*(或更可能的shared_ptrunique_ptr左右的形状)作为你的模板类型。

可以把它看作是模板类型的基本类型。如果你使用vector<int>,你得到的是实际的整型数。同样的道理也适用于对象