Переопределить чисто виртуальный метод с реализацией родительского класса в C++

Я использую множественное наследование, чтобы предоставить два разных интерфейса, которые совместно используют похожий метод. Код MWE выглядит следующим образом:

struct A {
    virtual void foo() = 0;
};

struct B {
    virtual void foo() = 0;
};

struct C : public A {
    virtual void foo() override { }
};

struct D : public B, public C {
};

int main(void) {
    D x;
    return 0;
}

Но это приводит к следующей ошибке при компиляции с g++:

main.cpp: In function ‘int main()’:
main.cpp:17:4: error: cannot declare variable ‘x’ to be of abstract type ‘D’
  D x;
    ^
main.cpp:13:8: note:   because the following virtual functions are pure within ‘D’:
 struct D : public B, public C {
        ^
main.cpp:6:15: note:     virtual void B::foo()
  virtual void foo() = 0;
               ^~~

Я пытаюсь избежать ромба (я просто хочу предоставить два интерфейса с некоторыми общими методами), и я бы предпочел не переопределять foo() в struct D, даже если это просто позвонить C::foo(),

Есть ли способ обойти это?

1 ответ

В какой-то момент вам действительно придется реализовать B:: foo, даже если он просто перенаправляет в какую-то другую функцию, этого требования не существует. B::foo просто не имеет ничего общего с A::foo, они совершенно разные функции для компилятора.

Если B::foo() действительно должен быть A::foo(), то вполне вероятно, что B должен быть производным от A, а B вообще не должен иметь foo.

Другие вопросы по тегам