使用纯虚类创建向量(模板)
Using pure virtual classes to create vectors (template)
我现在有一个叫做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_ptr
或unique_ptr
左右的形状)作为你的模板类型。
可以把它看作是模板类型的基本类型。如果你使用vector<int>
,你得到的是实际的整型数。同样的道理也适用于对象
相关文章:
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 为什么C++常量模板化向量在使用之前没有初始化?
- 标准::向量声明中使用的模板参数
- 在C++中,如何创建包含可变模板对象的异构向量?
- C++模板功能检查唯一向量
- 有什么方法可以将具有不同模板参数的模板类实例放入向量中?
- 使用模板化分配器和对向量进行排序的函数
- 模板化类的不同专业的向量
- C++ N 维向量的模板化别名
- 如何使用模板获取向量中的数据类型?
- 将不同类型的模板参数包提取到双精度向量中会产生警告
- 在模板类中创建向量 C++
- C++ 模板化类对象的向量
- 将任意模板向量作为函数参数C++传递
- C++模板,用于通过常量引用和原始指针传递向量
- 向量模板类:擦除(迭代器开始,迭代器端)
- 使用纯虚类创建向量(模板)
- bubbleSort向量模板类
- C++标准::向量模板与插入
- 专用向量模板的大括号初始化