Вот что говорит стандарт ... (C ++ 11, 12.4 / 8)
После выполнения тела деструктора и уничтожения любых автоматических объектов, размещенных в теле, деструктор для класса X
вызывает деструкторы для прямых неизменяемых нестатических элементов данных X
, деструкторы для прямых базовых классов X
и, если X
- это типа наиболее производного класса (12.6.2), его деструктор вызывает деструкторы для виртуальных базовых классов X
. Все деструкторы вызываются так, как если бы на них ссылались с квалифицированным именем, то есть игнорируя любые возможные виртуальные переопределяющие деструкторы в более производных классах. Базы и члены уничтожаются в порядке, обратном завершению их конструктора (см. 12.6.2). Оператор return (6.6.3) в деструкторе может не возвращаться напрямую вызывающей стороне; перед передачей управления вызывающей стороне вызываются деструкторы для членов и баз. Деструкторы для элементов массива вызываются в порядке, обратном их построению (см. 12.6).
Обратите внимание, что этот порядок действительно является обратным порядку, указанному в 12.6.2 / 10 в C ++ 11. Вы не можете определить порядок уничтожения виртуальных баз, глядя только на 12.4 / 8, но вы можете вывести его из 12.6.2 / 10, который указывает, что инициализация виртуальных баз происходит при поиске в глубину слева направо. -правильный порядок. (Таким образом, уничтожение виртуальных баз происходит в обратном порядке.)
В любом случае, у вас есть ответ. Сначала уничтожаются нестатические члены, а затем базовые классы. Но члены базового класса будут уничтожены до запуска деструктора next базового класса. Это действительно похоже на поиск в глубину.
05.02.2015