Подтвердить что ты не робот

С++ множественный порядок наследования

Я пытаюсь понять влияние порядка наследования на С++.. Я смотрел онлайн, но я не мог найти ясный и достаточный ответ...

Итак, ради вопроса, предположим, что существуют 2 класса: класс B и класс C.

Теперь определите:

class A1 : public B, public C{ ... };
class A2 : public C, public B{ ... };

В чем разница между A1 и A2?

Спасибо большое!

4b9b3361

Ответ 1

Порядок вывода имеет значение только для определения порядка инициализации по умолчанию конструкторами и очистки деструкторами.

Порядок вывода не имеет значения, кроме как определено семантикой инициализации конструктором (12.6.2), очисткой (12.4) и макетом хранения (9.2, 11.1). - конец примечания] "(§10.1/2)

Из документации IBM С++: Множественное наследование

Ответ 2

Стандарт С++ 11 гласит (§10.1) [class.mi]:

Порядок деривации не имеет значения, за исключением случаев, указанных в семантика инициализации конструктором (12.6.2), очистки (12.4), и расположение хранилища (9.2, 11.1).

Три упомянутых абзаца показывают, что

  • Конструкторы вызываются в том порядке, в котором вы их записываете (первый базовый класс в списке создается первым) (§12.6.2.10). Различные правила применяются к виртуальным базовым классам, которые всегда создаются из самого производного класса перед любыми прямыми базовыми классами.
  • Деструкторы вызываются в обратном порядке построения (первый базовый класс в списке уничтожается последним)
  • Расположение хранилища не указано. Вы не должны делать никаких предположений о расположении классов в памяти. Единственное исключение - это так называемые классы стандартной компоновки (§9), которые в основном являются структурой в стиле Си. Но так как им не разрешено иметь более одного класса с нестатическими членами в иерархии классов, этот вопрос на самом деле здесь не применим.

Обратите внимание, что расположение памяти может быть важным. Например, если внешняя библиотека делает наивные приведения в стиле C, которые предполагают, что часть интересующего ее объекта находится в начале, это может привести к ошибкам во время выполнения, которые трудно отладить.