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

时间:2015-09-12 23:05:48

标签: c++ inheritance

我目前有一个名为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;

我实际上并没有创建一个&#34;对象&#34;因为我只创建一个类型为vector的向量并添加Circle和Square。那为什么这不起作用?我知道如果我使Shape不是一个纯虚拟类,我可以继承。

我的逻辑是,没有理由让我实例化一个类型&#34; Shape&#34;所以我把它变成纯虚拟的,但我仍然想用一个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();
}

1 个答案:

答案 0 :(得分:4)

你的陈述“我实际上并没有创建一个”对象“,因为我只创建了一个类型为vector的向量并添加了Circle和Square。”是不正确的。您正在创建实际Shape个对象的向量。由于您无法实例化Shape,这就是您收到错误的原因。您需要使用Shape*(或更有可能是shared_ptrunique_ptr围绕Shape)作为模板类型。

将原始类型视为模板类型。如果您使用vector<int>,则会在向量中获得实际的整数。同样的想法也适用于对象。