我有基本的抽象类Employee,具有纯虚拟方法克隆
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);
}
我在main中存在问题,无法更改main。
答案 0 :(得分:3)
我不确定其他答案的含义是“您不要重写,因为返回类型不同”。返回类型不是函数签名的一部分,最好将返回类型更改为派生类型,前提是返回类型最初是指针或对类型的引用(即它们是{{ 3}}-感谢您提供的链接HolyBlackCat)。
以下示例进行编译(警告未使用的变量)。 covariant types:
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
的变量?
答案 1 :(得分:-4)
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);
}
很难理解您不能更改主对象的含义,但是要利用多态性,理想情况下,您将创建一个基类指针,为它分配派生类对象的地址,并将该指针传递给周围。 / p>