【发布时间】:2019-08-11 11:11:56
【问题描述】:
在实例化从其他具有抽象方法的类继承的类时,我收到编译器错误C2259。
继承方案有点奇怪和不透明,但由于问题的一些限制,我需要这样做。
继承方案如下:
class A
{
public:
enum Animal { CAT, DOG };
enum Color { RED, GREEN };
enum Food { MEAT, FISH };
protected:
virtual Animal animal() const = 0;
virtual Color color() const = 0;
virtual Food food() const = 0;
};
class B: public A
{
Animal animal() const { return CAT; }
};
class C: public A
{
Color color() const { return GREEN; }
};
class D: public A
{
Food food() const { return FISH; }
};
然后我声明一个具有多重继承的类,如下所示:
class E : public B, public C, public D
{
};
在这里,当我尝试实例化 E 类时,出现编译器错误 C2259:
error C2259: 'E': cannot instantiate abstract class
note: due to following members:
note: 'A::Color A::color(void) const': is abstract
note: see declaration of 'A::color'
note: 'A::Food A::food(void) const': is abstract
note: see declaration of 'A::food'
note: 'A::Animal A::animal(void) const': is abstract
note: see declaration of 'A::animal'
我做错了什么?
非常感谢
哈维尔
【问题讨论】:
-
还有虚拟析构函数在哪里?
-
...服务的唯一目的是防止人们复制粘贴和编译您的代码。E有 3 个不同的A副本,它们都没有实现所有的纯虚函数。您想改用virtual继承。 -
不是子类需要虚拟析构函数,是原来的父类
A。 -
请求不是粘贴所有代码,而是粘贴足以重现问题的可编译代码。让人们在测试之前编辑您的代码只会增加帮助所需的工作量。0
标签: c++ inheritance abstract-class multiple-inheritance virtual-functions