我得到了一个名为Worker的基类和两个派生类Merchant和Baker。
class Worker
{
private:
string _name;
public:
Worker(string, string, string, int);
~Worker();
virtual string atributes() = 0;
};
class Merchant : public Worker
{
private:
string _skillLevel;
public:
Merchant(string, string);
string atributes() override;
};
class Baker : public Worker
{
private:
string yearsOfExperiance;
public:
Baker(string, string);
string atributes() override;
};
我创建了列表list<Workers> Workers
,我正在添加像这样的Merchant和Baker对象:
void addToList(string name, string atributes, list<Worker>& Worker)
{
if (name == "John")
{
Baker kk = Baker(name, atributes);
Workers.push_front(kk);
}
else if (profesja == "Barack")
{
Merchant pp = merchant(name, atributes);
Workers.push_front(pp);
}
}
问题是当我尝试编译代码时发生C2259错误。它说
&#39;工人&#39;:无法实例化absract class
你能告诉我如何解决这个问题吗?
答案 0 :(得分:1)
您尝试使用多态而不使用指针或引用,这不起作用,因为会发生对象切片,并且对象切片需要能够构造切片类型。
STL集合通过故事复制值来工作,这意味着在这里
Baker kk = Baker(name, atributes);
Workers.push_front(kk);
在堆栈上创建了一个Baker
对象,然后添加到集合中,但该集合被模板化以存储Worker
个实例,因此该方法尝试构造一个Worker
实例来自Builder
(由于Builder
是Worker
应该是合法的)通过复制构造函数。
所以基本上push_back
试图做的是
Builder builder = Builder();
Worker worker = Worker(builder);
但是这不可能,因为Worker
是抽象的。
要解决此问题,您必须使用指针,可能还有智能指针包装器,例如:
std::vector<std::unique_ptr<Worker>> workers;