无法实例化抽象类

Cannot instantiate abstract class

本文关键字:抽象类 实例化      更新时间:2023-10-16

我有基础 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 是什么意思,但要利用多态性,理想情况下,你会创建一个基类指针,为其分配派生类对象的地址并传递指针。