无法实例化抽象类
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 感谢您的参考。这对我来说是新事物。我认为它会像往常一样发出一个冲突的返回类型错误。以上是关于无法实例化抽象类的主要内容,如果未能解决你的问题,请参考以下文章
mypy 错误:向抽象方法添加类型时无法使用抽象属性实例化抽象类
Visual Studio 2015“无法实例化抽象类”编译失败构建 openFrameworks 0.9.0