Ссылаясь на Википедию в https://en.wikipedia.org/wiki/Multiple_inheritance в пуле Curl:
Curl позволяет только классам, которые явно помечены как общие, наследоваться повторно.Общие классы должны определять вторичный конструктор для каждого обычного конструктора в классе.Обычный конструктор вызывается в первый раз, когда состояние для общего класса инициализируется через конструктор подкласса, и вторичный конструктор будет вызываться для всех других подклассов.
Отсюда, без знания Curl и толькос приведенной выше цитатой и this , где указано, что
Семантика объекта Curl аналогична семантике Java и C ++.
Учитывая
A
/ \
B(A) C(A)
\ /
D(B,C)
Я представляю (точно не знаю), что кодер отвечает за устранение неоднозначности проблемы путем указания квалифицированного имени конструктора для запуска при вызове родительского конструктора из D (B, C) подкласс.
Похоже, что A должен быть объявлен shared
, и когда D создается, B запускает конструктор, который вызывает конструктор A (основной), C запускает конструктор, который вызывает A (вторичный) конструктор.Различие между первичным / вторичным вызовом конструктора является автоматическим и прозрачным для кодировщика.
При вызове двух конструкторов A в памяти создаются два объекта A, то есть класс A используется совместно с двумя разными подклассами, нонет ни одного «общего» объекта A, а двух независимых (см. также виртуальное / не виртуальное наследование , которое как-то связано (C ++).)
Для того, что я читал дляна нескольких разных языках почти всегда кодер устраняет проблему алмаза с квалификацией.Языки просто определяют разные или похожие схемы выдачи ошибки или наличия критериев для выбора одного из множества неоднозначных определений, например, определенного порядка поиска в цепочке наследования.В некоторых других языках даже не допускается множественное наследование, но в некоторых из них вам разрешено расширять функциональность другими способами (например, интерфейсами).