Невозможно создать экземпляр абстрактного класса с множественным наследованием c ++ - PullRequest
0 голосов
/ 20 марта 2019

Я получаю ошибку компилятора 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'

Что я делаю не так?

Большое спасибо

Javier

1 Ответ

5 голосов
/ 20 марта 2019

У вас есть 3 различных объекта A внутри E, вы забыли пометить наследование как виртуальное, чтобы использовался один и тот же объект 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;
}
...