Переопределить чисто виртуальный метод с реализацией родительского класса в 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.