C ++在尝试覆盖方法时无法实例化抽象类

时间:2016-01-20 01:27:26

标签: c++ list class override abstract-class

我得到了一个名为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

你能告诉我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您尝试使用多态而不使用指针或引用,这不起作用,因为会发生对象切片,并且对象切片需要能够构造切片类型。

STL集合通过故事复制值来工作,这意味着在这里

 Baker kk = Baker(name, atributes);
 Workers.push_front(kk);

在堆栈上创建了一个Baker对象,然后添加到集合中,但该集合被模板化以存储Worker个实例,因此该方法尝试构造一个Worker实例来自Builder(由于BuilderWorker应该是合法的)通过复制构造函数。

所以基本上push_back试图做的是

Builder builder = Builder();
Worker worker = Worker(builder);

但是这不可能,因为Worker是抽象的。

要解决此问题,您必须使用指针,可能还有智能指针包装器,例如:

std::vector<std::unique_ptr<Worker>> workers;