Когда вызывается деструктор класса X
, объект, к которому он был вызван, перестает быть объектом типа X
.
Предположим, у вас есть класс Y
, который наследуется от X
и класс Z
, который наследуется от Y
.По принципам объектно-ориентированного наследования каждый Y
равен X
.И каждый Z
является a Y
и X
.
Посмотрите, что происходит при удалении объекта типа Z
, если деструкторы вызываются из самых производных в базу:
Сначала выполняется деструктор Z
,Объект перестает быть Z
и превращается в Y
.
Затем выполняется деструктор Y
.Объект перестает быть Y
и снова превращается в X
.
Затем выполняется деструктор X
.Объект перестает быть X
и теперь вообще ничем (полностью уничтожен).
Теперь рассмотрим, что произойдет, если вместо этого сначала был вызван базовый деструктор:
- Сначала выполняется деструктор
X
.Объект перестает быть X
.
Теперь, что это за объект?Это не X
, но это также не может быть Y
, поскольку Y
- это и X
.Это не может быть Z
, поскольку Z
тоже и X
!На данный момент объект не имеет четко определенного типа, и поэтому вызов другого метода, даже другого деструктора, приведет к поведению, которое невозможно определить.
Говоря более конкретно: вполне возможно, чтоДеструктору Z
или деструктору Y
требуется доступ к чему-то, что определено в классе X
.Так что деструктор X
должен запускаться последним.Обратите внимание, что в другом направлении проблем нет, поскольку базовый класс X
не может получить доступ к чему-либо в своих производных классах.