Как проблема с бриллиантами в oops решается с помощью "общей" стратегии?

Проблема с бриллиантом решается в некоторых языках OOPS (например, curl), имея повторно унаследованный класс как "общий"? Я хочу знать, как это работает. Кроме того, я хочу знать роль первичных и вторичных конструкторов в решении проблемы алмазов на этих языках OOPS при использовании общей стратегии. Предположим, есть 4 класса, скажем, A,B,C и D. Пусть структура наследования - B, а C наследует A, а D наследует и B, и C. Каждый класс имеет переменную, скажем, A имеет a, B имеет b, C имеет c и D имеет d. Как происходит создание объекта для каждого класса?

1 ответ

Ссылаясь на Википедию по адресу https://en.wikipedia.org/wiki/Multiple_inheritance на странице Curl:

Curl допускает повторное наследование только тех классов, которые явно помечены как общие. Общие классы должны определять вторичный конструктор для каждого обычного конструктора в классе. Обычный конструктор вызывается в первый раз, когда состояние общего класса инициализируется через конструктор подкласса, и вторичный конструктор будет вызываться для всех других подклассов.

Отсюда, не зная Curl и только с цитатой выше, и это, где утверждается, что

Семантика объекта Curl аналогична семантике Java и C++.

Дано

    A
   /  \
 B(A) C(A)
   \   /
   D(B,C)

Я представляю (я не знаю точно), что кодер отвечает за устранение неоднозначности проблемы путем указания квалифицированного имени конструктора для запуска при вызове родительского конструктора из подкласса D(B,C).

Похоже, А должен быть объявлен shared и когда D создается, B запускает конструктор, который вызывает A (основной) конструктор, C запускает конструктор, который вызывает A (вторичный) конструктор. Различие между вызовом первичного / вторичного конструктора является автоматическим и прозрачным для кодировщика.

При вызове двух конструкторов A в памяти создаются два объекта A, то есть класс A используется совместно с двумя разными подклассами, но не существует ни одного "общего" объекта A, а двух независимых (см. Также виртуальное / не виртуальное наследование). это как-то связано (C++).)

Из того, что я прочитал для нескольких разных языков, почти всегда именно кодер устраняет проблему алмаза с квалификацией. Языки просто определяют разные или похожие схемы выдачи ошибки или наличия критериев для выбора одного из множества неоднозначных определений, например определенного порядка поиска в цепочке наследования. В некоторых других языках даже не допускается множественное наследование, но в некоторых из них вам разрешено расширять функциональность другими способами (например, интерфейсами).

Другие вопросы по тегам