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

标签 c++ list class overriding 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 错误。它说

'Worker': cannot instantiate absract class

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

最佳答案

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

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;

关于C++在尝试覆盖方法时无法实例化抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34889974/

相关文章:

c++ - 如何检查 UnicodeString 的字符?

c++ - 此代码是否泄漏内存?我需要释放任何东西吗? C++内存

python - 从 n 个相等的项目中挑选与最小数字相关的项目

java - 有没有办法让我能够对 System.in 输入和 FileInputStream 输入使用相同的扫描仪?

c++ - 在代码::Blocks中更改类变量大小写

c++ - C++中的简单通配符搜索算法

list - Prolog 评估两个列表如何相互比较

python - 3SUM(查找列表中所有唯一的三元组等于 0)

c++ - 让类成员函数调用类外的函数

c++ - MSBuild - 无法打开包含文件(尽管列在 INCLUDE 列表中)