У нас уже есть в репозитории
(1) А.а
Код: Выделить всё
class A : public X, public Y, public Z
{
...
}
Код: Выделить всё
template
class BTempl: public A
{
...
}
Код: Выделить всё
template
class CTempl: public BTempl
{
...
}
Код: Выделить всё
template
class DTempl: public CTempl
{
...
}
(5) E.h
Код: Выделить всё
template
class ETempl: public A
{
...
}
Код: Выделить всё
template
class DTempl: public CTempl, public ETempl
{
...
}
Код: Выделить всё
error: non-static member 'getParam' found in multiple base-class subobjects of type 'X2':
class DTempl -> CTempl -> BTempl -> class A -> class X -> class X1 -> class X2
class DTempl -> ETempl -> class A -> class X -> class X1 -> class X2
Код: Выделить всё
template
class ETempl: virtual public A
{
...
}
Код: Выделить всё
template
class CTempl: virtual public BTempl
{
// This is not allowed for my purposes; see below.
}
Есть ли хороший способ «сломать только одну ногу» этой проблемы наследования? А именно, я бы по-прежнему хотел, чтобы E наследовал от A, но я хочу, чтобы D наследовал только все необходимое от E. Все повторяющиеся методы (такие как «getParam» выше) должны наследоваться только один раз, предпочтительно через C. Методы, которые E должен был бы наследовать от A, их слишком много, чтобы их перечислять, и мне, по-видимому, не разрешено изменять A, чтобы помешать D наследовать эти методы от A через E.
Одну вещь, которую я пытался сделать исправить это можно было бы поместить то, что должно было быть в EC и E.h, непосредственно в DC и D.h или, если на то пошло, в CC и C.h, а затем позвольте D наследовать все от C. Однако из-за особенностей того, что задействовано в коде, я бы получил циклические зависимости, такие как следующие (код компилируется успешно, но запуск приводит к немедленным сбоям), потому что D потребуется доступ к таким переменным, как P, сразу после инициализации:
Код: Выделить всё
*** ERROR ***
Cyclic dependency detected in object ordering:
P
Подробнее здесь: [url]https://stackoverflow.com/questions/78468401/breaking-one-leg-of-diamond-inheritance-problem-alternatives[/url]