C++ наследование нескольких бриллиантов и чисто виртуальные функции

Рассмотрим следующую архитектуру:

class A  //abstract interface
{
    public:
    virtual void f() = 0;
};
class AA : public A  //abstract interface
{
    public:
    virtual void g() = 0;
}; 
class AAA : public AA  //abstract interface
{
    public:
    virtual void h() = 0;
}; 

class B :  public A // implementation class
{
    public:
    void f() override {};
};
class BB : public B, public AA {}; // implementation class
{
    public:
    void g() override {};
};
class BBB : public BB, public AAA {}; // implementation class
{
    public:
    void h() override {};
};

В качестве таких, BB а также BBB являются виртуальными классами, потому что f не переопределяется BB, и ни f, ни g не BBB. Мое желание - иметь возможность создавать экземпляры BB и BBB (чтобы BB и BBB использовали переопределение f, определенное B, а BBB использует переопределение g, определенное BB).

Вопрос в том, какие наследственные отношения должны быть помечены как virtual создать экземпляр BB а также BBB ?

Диаграмма наследования в идеале должна выглядеть так:

A
|\
| \
|  \
AA   B
| \  |
|  \ |
AAA  BB
  \  |
   \ |
     BBB

Идея этого проекта заключается в том, что A, AA и AAA являются интерфейсами, описывающими дополнительные уровни возможностей. B, BB и BB являются одной соответствующей инкрементной реализацией. (Так что BB, например, определяет все, что нужно AA, а также показывает, что находится в B)

1 ответ

Если A AA AAA на самом деле только интерфейсы, я имею в виду, что они не имеют никаких членов, то вам не нужно никаких virtaul наследовать, реализовывать только интерфейсы и вызывать их из базовых классов. То, что вы реализовали в B для интерфейса A, должно быть реализовано также в BB, затем вызовите B:pureVirtual() в BB, В противном случае должно быть так; (Тогда вы должны взглянуть на: 'class1': наследует 'class2::member' через доминантность)

class A
{
public:
  virtual void f() = 0;
};
class AA : virtual public A
{
public:
  virtual void g() = 0;
};
class AAA : virtual public AA
{
public:
  virtual void h() = 0;
};

class B : virtual public A
{
public:
  void f() override { }
};
class BB : public B, virtual public AA
{
public:
  void g() override { }
};
class BBB : public BB, public AAA
{
public:
  void h() override { }
};

Изменить: (без виртуального наследования)

class A  //abstract interface
{
public:
  virtual void f() = 0;
};
class AA : public A  //abstract interface
{
public:
  virtual void g() = 0;
};
class AAA : public AA  //abstract interface
{
public:
  virtual void h() = 0;
};

class B : public A // implementation class
{
public:
  void f() override {}
};
class BB : public B, public AA // implementation class
{
public:
  void g() override {}
  void f() override { B::f(); }
};
class BBB : public BB, public AAA // implementation class
{
public:
  void h() override {}

  void g() override { BB::g(); }
  void f() override { BB::f(); }
};
Другие вопросы по тегам