尝试覆盖方法时,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
的实例(这应该是合法的,因为 Builder
是 Worker
)通过复制构造函数。
所以基本上 push_back
试图做的是
Builder builder = Builder();
Worker worker = Worker(builder);
但这做不到,因为Worker
是抽象的。
为了解决这个问题你必须使用指针,可能连同一个智能指针包装器,例如:
std::vector<std::unique_ptr<Worker>> workers;
我得到了名为 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
的实例(这应该是合法的,因为 Builder
是 Worker
)通过复制构造函数。
所以基本上 push_back
试图做的是
Builder builder = Builder();
Worker worker = Worker(builder);
但这做不到,因为Worker
是抽象的。
为了解决这个问题你必须使用指针,可能连同一个智能指针包装器,例如:
std::vector<std::unique_ptr<Worker>> workers;