无法实例化抽象类

Posted

技术标签:

【中文标题】无法实例化抽象类【英文标题】:Cannot instantiate abstract class 【发布时间】:2019-05-26 12:53:07 【问题描述】:

我有一个带有纯虚方法克隆的基础抽象类 Employee

virtual Employee* clone() const = 0;

我还派生了重写此方法的 DeveloperEmployee 类:

DeveloperEmployee* clone() const override 
        return new DeveloperEmployee(this->description, this->project);

现在我在 main 中有这些行:

DeveloperEmployee* a = new DeveloperEmployee(description, project);
DeveloperEmployee* a_copy = a->clone();

而且我无法更改这些行。说我不能实例化抽象类,那我应该怎么改代码呢?

如果我将覆盖的方法更改为

Employee* clone() const override 
        return new DeveloperEmployee(this->description, this->project);

我在 main 中出现了转换问题,我无法更改 main。

【问题讨论】:

你改变了返回的类型,这意味着没有适当的覆盖。不管怎样,关于多态性的想法实际上是使用相同的(基类)类型。 @OznOg 允许:en.cppreference.com/w/cpp/language/… @goodvibration ^ 请编辑您的问题以包含minimal reproducible example 另外请添加错误消息的确切措辞。 【参考方案1】:

我不确定“您不覆盖,因为返回类型不同”的其他答案是什么意思。返回类型不是函数签名的一部分,将返回类型更改为派生类型是完全可以的,假设返回类型最初是一个类型的指针或引用(即它们是 @987654321 @ - 感谢您的链接 HolyBlackCat)。

以下示例编译(带有未使用变量的警告)。 See it online!:

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 类型的变量?

【讨论】:

不,它说问题出在这行代码中,所以我不太明白是什么问题,如果你愿意,我可以提供完整的代码 @YuriyRusanov “如果你愿意,我可以为你提供完整的代码”不,你想向我们提供足够的信息以便我们可以帮助你,而不是相反 @Yuriy 正如在 cmets 中的 HolyBlackCat 所要求的,您应该提供完整的错误消息(它通常指示出错的行和文件) @Yksisarvinen 我认为它会像通常情况一样发出冲突的返回类型错误。这对我来说是新事物。感谢您的启发。【参考方案2】:

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);

很难理解你的意思是什么,你不能改变主,但要利用多态性,你最好创建一个基类指针,用派生类对象的地址分配它,然后传递指针。

【讨论】:

en.cppreference.com/w/cpp/language/… @HolyBlackCat 感谢您的参考。这对我来说是新事物。我认为它会像往常一样发出一个冲突的返回类型错误。

以上是关于无法实例化抽象类的主要内容,如果未能解决你的问题,请参考以下文章

C ++无法实例化抽象类子

错误 C2259:“类”:无法实例化抽象类

mypy 错误:向抽象方法添加类型时无法使用抽象属性实例化抽象类

Visual Studio 2015“无法实例化抽象类”编译失败构建 openFrameworks 0.9.0

firebase:InstantiationException:无法实例化抽象类 java.util.TimeZone

抽象类