无法实例化抽象类
Cannot instantiate abstract class
我有基础 abastract 类 具有纯虚拟方法克隆的员工
virtual Employee* clone() const = 0;
此外,我还有派生类 DeveloperEmployee 可以覆盖此方法:
DeveloperEmployee* clone() const override {
return new DeveloperEmployee(this->description, this->project);
}
现在我主要有这些行:
DeveloperEmployee* a = new DeveloperEmployee(description, project);
DeveloperEmployee* a_copy = a->clone();
而且我无法更改这些行。它告诉我我不能实例化抽象类,那么我应该如何更改代码?
如果我将覆盖的方法更改为
Employee* clone() const override {
return new DeveloperEmployee(this->description, this->project);
}
我在主中投射有问题,我无法更改主。
我不确定其他答案"您不覆盖,因为返回类型不同"是什么意思。返回类型不是函数签名的一部分,将返回类型更改为派生类型是完全可以的,前提是返回类型最初是对类型的指针或引用(即它们是协变类型 - 感谢链接 HolyBlackCat(。
下面的示例编译(带有有关未使用变量的警告(。在线观看!
class A{
public:
virtual A* foo() const = 0;
};
class B:public A{
public:
B* foo() const override {return new B();}
};
int main() {
B b;
A* ptr = b.foo();
}
如果不允许,编译器会因为 override
关键字而抛出错误,例如在 GCC 中:
prog.cc:12:17: error: conflicting return type specified for 'virtual
std::__cxx11::string B::bar()'
std::string bar() override { return {}; }
^~~
prog.cc:6:20: note: overridden function is 'virtual double A::bar()'
virtual double bar() = 0;
^~~
问题出在代码中未显示的某个位置。也许您正在尝试在某处创建 Employee
类型的变量?
DeveloperEmployee* clone() const override
不能覆盖virtual Employee* clone() const
,因为返回类型不同。只要你不覆盖virtual Employee* clone() const
你就不能实例化DeveloperEmployee
的实例,因为它是一个纯虚函数。
DeveloperEmployee
应具有以下定义。
Employee* clone() const override {
return new DeveloperEmployee(this->description, this->project);
}
很难理解你不能改变 main 是什么意思,但要利用多态性,理想情况下,你会创建一个基类指针,为其分配派生类对象的地址并传递指针。
相关文章:
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- C++包括类名间距和类实例化
- 如何使用其中一个具体类实例化抽象类?
- 不带尖括号的模板类实例化
- 使用父类实例化的向下转换对象
- 模板类实例化中的指针转换无效
- 类的私有成员在我的类实例化期间更改,即使他们不应该
- 反向函数不反转类实例化的引用字符串
- 在类实例化时生成一个数字
- 谷歌测试 - 为模板类实例化生成值
- 使用派生类实例化基类,而不在对象定义中使用指针
- 模板类实例化如何与类继承协同工作
- 枚举器而不是用于类实例化的构造函数
- 使用std :: make_shared抽象类实例化的错误
- 通过纯虚拟函数防止类实例化
- C 11枚举类实例化
- 阿达水果示例中的 Bizare 类实例化
- 从标头中的类实例化对象
- C++类实例化是否可以在运行时更改其大小
- 抽象类实例的动态初始化