Алмазное наследование с дополнительным конструктором копирования классов - PullRequest
0 голосов
/ 27 июня 2018

В последнее время мне стало интересно, как будет выглядеть конструктор копирования класса, если у нас есть базовый класс A, который фактически наследуется B и C, где B и C наследуются D и D наследуется E.

enter image description here

Так что я немного растерялся. Должен ли D конструктор копирования по-прежнему иметь конструктор базового класса (A) в своем списке инициализации или это работа E сейчас? Верно ли, что E может наследовать D не виртуально?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Неявно сгенерированный конструктор копирования работает нормально, но если вы хотите явно написать его самостоятельно, он может выглядеть следующим образом:

D(D const &o): A(o), B(o), C(o) {}

E(E const &o): A(o), D(o) {}

В целях инициализации виртуальные базовые классы ведут себя так, как будто они являются прямой базой наиболее производного объекта. Любой инициализатор в подобъекте игнорируется (например, в моем коде для E инициализация D(o) фактически не инициализирует A, несмотря на то, что A указан в конструкторе копирования D).

Это то же самое, независимо от того, наследует ли E виртуально D.

Ссылка для дальнейшего чтения

0 голосов
/ 27 июня 2018

Да, A все еще должен быть в списке инициализации, и E не нужно фактически наследовать D. Порядок строительства должен быть:

A() --> B() --> C() --> D()
...