尝试覆盖方法时,C++ 无法实例化抽象 class

C++ Cannot instantiate abstract class when trying to override a method

我得到了名为 Worker 的基础 class 和两个派生的 classes 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 错误。它说

'Worker': cannot instantiate absract class

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

您试图在不使用指针或引用的情况下使用多态性,这不起作用,因为会发生对象切片并且对象切片需要能够构造切片类型。

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;