Упорядочение деструкторов в иерархии наследования

Если у меня есть следующая иерархия:

  • Класс F содержит объекты-члены типа (класс E и класс D, объявленные в этом порядке)
  • Класс F наследует конкретный класс C
  • Класс C наследует абстрактный / чистый виртуальный класс Class B
  • Класс B наследует конкретный класс класса A

Если вызывается деструктор для объекта типа Class F, происходит следующее в следующем порядке:

  1. Класс F (самый производный) деструктор вызывается и заканчивается
  2. Деструктор класса D (член-объект 2) вызывается и завершается
  3. Деструктор класса E (член-объект 1) вызывается и завершается
  4. Деструктор класса C (база F) вызывается и заканчивается
  5. Деструктор класса A (основание B, которое является основанием C) называется и завершается
  6. Деструктор класса B (виртуальный, база C) вызывается и завершается

это правильно? Таким образом, в основном к концу C наследует виртуальный B, а виртуальный B наследует A, но C уничтожается, затем A, затем виртуальный B?

РЕДАКТИРОВАТЬ: C ++ часто задаваемые вопросы говорит:

«Виртуальные базовые классы особенные — их деструкторы вызываются на
конец конструктора самого производного класса «

что я пытаюсь понять?

1

Решение

Деструкторы выполняются в обратном порядке конструкторов. Это почти все, что вам нужно знать.

ОБНОВЛЕНИЕ: Это верно даже для виртуальных баз. Вам просто нужно понять, что виртуальные базы создаются раньше любого другого базового класса.

3

Другие решения

Возможно, проще всего выразить порядок вызовов деструкторов в виде алгоритма.

уничтожить

  1. Делайте все, что программист написал в теле деструктора: F::~F() { do_this; do_that; }
  2. уничтожить (вызов деструкторов для) членов
  3. уничтожить (вызов деструкторов для) не виртуальных базовых классов
  4. уничтожить (вызов деструкторов для) виртуальных базовых классов

Этот алгоритм выполняется языком (или компилятором), поэтому программист может контролировать только первый шаг.

Примечание: каждый из дальнейших шагов является рекурсивным.

Порядок вызовов деструктора является обратным порядком вызовов конструктора (это полезно знать, потому что порядок построения интуитивно понятен). Порядок уничтожения виртуальных баз указан как

обход слева направо в глубину графа базовых классов

К счастью, вам это не нужно, потому что у вас есть только один.

3

По вопросам рекламы [email protected]