我目前有一个名为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();
}
答案 0 :(得分:4)
你的陈述“我实际上并没有创建一个”对象“,因为我只创建了一个类型为vector的向量并添加了Circle和Square。”是不正确的。您正在创建实际Shape
个对象的向量。由于您无法实例化Shape
,这就是您收到错误的原因。您需要使用Shape*
(或更有可能是shared_ptr
或unique_ptr
围绕Shape)作为模板类型。
将原始类型视为模板类型。如果您使用vector<int>
,则会在向量中获得实际的整数。同样的想法也适用于对象。