В каком порядке будут уничтожены базовые классы?
У меня есть структура классов из трех классов, где два из них являются базовыми классами третьего, как это:
class A {
};
class B {
};
class C : public A, public B {
};
Когда экземпляр C
должен быть уничтожен, в каком порядке находятся базовые классы A
а также B
уничтожены? Есть ли для этого правила?
1 ответ
Есть правила (C++11 §12.4):
После выполнения тела деструктора и уничтожения любых автоматических объектов, размещенных в теле, деструктор для класса X вызывает деструкторы для прямых невариантных нестатических членов-данных X, деструкторы для прямых базовых классов X и, если X является тип самого производного класса (12.6.2), его деструктор вызывает деструкторы для виртуальных базовых классов X. Все деструкторы вызываются так, как если бы на них ссылались с определенным именем, то есть игнорируя любые возможные виртуальные переопределения деструкторов в более производных классах. Основания и элементы уничтожаются в порядке, обратном завершению их конструктора (см. 12.6.2). Оператор return (6.6.3) в деструкторе может не возвращаться напрямую к вызывающей стороне; перед передачей управления вызывающей стороне деструкторы для членов и баз вызываются. Деструкторы для элементов массива вызываются в обратном порядке их построения (см. 12.6).
Порядок строительства (§12.6.2/10):
В не делегирующем конструкторе инициализация происходит в следующем порядке:
- Во-первых, и только для конструктора самого производного класса (1.8), виртуальные базовые классы инициализируются в том порядке, в котором они отображаются при обходе слева направо по глубине ориентированного ациклического графа базовых классов, где "слева" -to-right "- порядок появления базовых классов в списке базовых спецификаторов производного класса.
- Затем прямые базовые классы инициализируются в порядке объявления по мере их появления в списке базовых спецификаторов (независимо от порядка mem-initializer).
- Затем элементы нестатических данных инициализируются в том порядке, в котором они были объявлены в определении класса (опять же, независимо от порядка инициализаторов mem).
- Наконец, составной оператор тела конструктора выполняется.[Примечание: Порядок декларации должен гарантировать уничтожение базовых и дочерних подобъектов в обратном порядке инициализации. - конец примечания]
Поэтому в простых случаях базовые конструкторы вызываются в том порядке, в котором классы перечислены в объявлении, а деструкторы работают в обратном порядке.