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(); }
};