Этот пример работает с виртуальным наследованием на C ++? - PullRequest
1 голос
/ 05 мая 2020

Могу ли я это сделать?

class A {
public:
  virtual void aFoo() = 0;
};

class B : virtual public A {
public:
  virtual void aFoo() { ... }
};

class D : public A {};

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

Проблема связана с реализацией aFoo() в B и отсутствием его в C. Когда дело доходит до компиляции, я вижу эту ошибку:

error: no unique final overrider for ‘virtual void A::aFoo()’ in ‘C’

Разве нельзя переопределить чистый виртуальный метод виртуального базового класса в B?


Только что отредактировал пример для соответствия фактическому варианту использования. Теперь, глядя на это упрощенно, я не совсем уверен, возможно ли это вообще, не говоря уже о хорошем дизайне.

1 Ответ

1 голос
/ 05 мая 2020

Вам нужно виртуальное наследование таким образом:

struct A {
    virtual int f() = 0;
};
struct B : virtual A {
    int f() { return 1; }
};
struct C : virtual A {};
struct D : B, C {};

int main() {
    D d;
    return d.f();
}

В прокомментированном мной дубликате вы можете увидеть это отношение

  A  
 / \  
B   C  
 \ /  
  D 

для виртуального наследования и

A   A  
|   |
B   C  
 \ /  
  D 

без виртуального наследования.

Во втором случае D содержит два определения функций. Один реализован, а другой нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...