Разрушение одной ноги проблемы наследования алмазов: альтернативы?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Разрушение одной ноги проблемы наследования алмазов: альтернативы?

Сообщение Anonymous »

Я участвую в большом программном проекте на C++. Вот проблема, с которой я столкнулся.
У нас уже есть в репозитории
(1) А.а

Код: Выделить всё

class A : public X, public Y, public Z
{
...
}
(2) Б.х

Код: Выделить всё

template 
class BTempl: public A
{
...
}
(3) Ч.х

Код: Выделить всё

template 
class CTempl: public BTempl
{
...
}
(4) Д.ч

Код: Выделить всё

template 
class DTempl: public CTempl
{
...
}
Теперь предположим, что мне нужна какая-то другая функциональность в DC, которую лучше всего реализовать, скажем, через EC и E.h. По необходимости E.h должен наследовать от A.h, который содержит методы, соглашения об именах и т. д., без чего невозможно обойтись:
(5) E.h

Код: Выделить всё

template 
class ETempl: public A
{
...
}
а затем измените D.h следующим образом:

Код: Выделить всё

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.
}
Но проблема в том, что, поскольку это большой программный проект, мне не разрешено вносить такие изменения в C.h - или, в лучшем случае, мне будет разрешено вносить минимальные изменения. которые не влияют на такие зависимости и наследование. Несколько других классов будут наследовать от C.h. Я попробовал, и это могло испортить многие другие вещи, вызвав другие виды ошибок компиляции. Точно так же мне не разрешено изменять зависимости в A, B или других исходных файлах и файлах заголовков.
Есть ли хороший способ «сломать только одну ногу» этой проблемы наследования? А именно, я бы по-прежнему хотел, чтобы 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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как поменять ноги и дюймы типа объекта рамка данных на дюймы: Python
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Ноги и бедро не вращаются во время круговой ходьбы - OpenSim Rajagopal2016
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как предотвратить разрушение макета графика matplotlib Axes.imshow?
    Anonymous » » в форуме Python
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Цепочка обмена Vulkan и разрушение поверхности вышли из строя
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Цепочка обмена Vulkan и разрушение поверхности вышли из строя
    Anonymous » » в форуме C++
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»