【问题标题】:Using pure virtual classes to create vectors (template)使用纯虚拟类创建向量(模板)
【发布时间】: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


【解决方案1】:

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

将其视为原始类型作为模板类型。如果您使用vector&lt;int&gt;,您将在向量中获得实际的整数。同样的想法也适用于对象。

【讨论】:

  • 啊,是的!你说得对。谢谢你的解释:)
猜你喜欢
  • 2013-10-07
  • 2015-07-12
  • 2018-09-06
  • 2020-03-22
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
相关资源
最近更新 更多