【问题标题】:Cannot instantiate abstract class with multiple inheritance c++无法用多重继承c ++实例化抽象类
【发布时间】: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


【解决方案1】:

E 中有 3 个不同的 A 对象,您忘记将继承标记为虚拟,以便使用相同的 A 对象:

class A
{
public:
    enum Animal { CAT, DOG };
    enum Color { RED, GREEN };
    enum Food { MEAT, FISH };

    virtual ~A(){}

protected:
    virtual Animal animal() const = 0;
    virtual Color color() const = 0;
    virtual Food food() const = 0;
};

class B: public virtual A
{
Animal animal() const override { return CAT; }
};

class C: public virtual A
{
Color color() const override { return GREEN; }
};

class D: public virtual A
{
Food food() const override { return FISH; }
};

class E : public B, public C, public D
{
};

int main()
{
    E e;
}

【讨论】:

  • 你是神!非常感谢!!
  • 我不会走那么远:p
  • FWIW,这是虚拟继承的典型例子——也经常被认为暗示了一个糟糕的初始设计。这当然是一种代码味道。如果你需要这个设计,这就是这样做的方法。
  • Matthieu,我从 80 年代的生活中学到的一件事是 when someone asks if you are a god, you say yes. 我认为这个案例很接近。
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
相关资源
最近更新 更多