С++ множественный порядок наследования
Я пытаюсь понять влияние порядка наследования на С++.. Я смотрел онлайн, но я не мог найти ясный и достаточный ответ...
Итак, ради вопроса, предположим, что существуют 2 класса: класс B и класс C.
Теперь определите:
class A1 : public B, public C{ ... };
class A2 : public C, public B{ ... };
В чем разница между A1 и A2?
Спасибо большое!
Ответы
Ответ 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, которые предполагают, что часть интересующего ее объекта находится в начале, это может привести к ошибкам во время выполнения, которые трудно отладить.