无法实例化抽象类

时间:2019-05-26 12:53:07

标签: c++ class oop inheritance polymorphism

我有基本的抽象类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。

2 个答案:

答案 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>

相关问题