Лучший ответ, почему деструкторы вызываются из производных в базу? - PullRequest
4 голосов
/ 14 октября 2011

Я недавно посетил интервью, где человек спросил меня, каков порядок строительства и разрушения.Я объяснил, что строительство происходило от базы к ребенку и разрушение от ребенка к базе.

Интервьюер очень хотел знать, есть ли какая-либо особая причина разрушения, происходящего от происхождения к базе.Я объяснил ему, но он не был убежден.

Суть его заключалась в том, что если уничтожение базового класса даст исключение, как производный класс узнает, как объект производного класса будет уже разрушен.

Он также говорил, что производный класс содержит члены базового класса, так почему мы не можем сначала вызвать уничтожение базового класса?

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

Я здесь?Какой лучший ответ здесь?

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Вы абсолютно правы.Я часто задавал этот вопрос, когда брал интервью у опытных программистов на С ++.Производный класс должен создаваться после базового класса, чтобы конструктор производного класса мог ссылаться на данные базового класса.По той же причине деструктор производного класса должен запускаться перед деструктором базового класса.Это очень логично: мы строим изнутри и уничтожаем извне. Если деструктор базового класса выдает исключение, он не может быть перехвачен деструктором производного класса.Также исключение в конструкторе базового класса не может быть обработано конструктором производного класса.Как правило, исключения не должны создаваться деструкторами.

1 голос
/ 14 октября 2011

В C # Конструкция объекта выполняется в следующем порядке:

  1. Инициализация элементов данных Производные -> База
  2. Выполнение базы конструкторов -> Производные.

Зачем?

  • Инициализация следует Derived -> Base, чтобы избежать повторной инициализации элементов, инициализируемых по-разному в производной от базы.
  • Конструкция следует Base -> Derived, поскольку конструктор Derived может полагаться на методыБазовый класс.

Другие языки обрабатывают инициализацию по-разному, но конструкция Base-> Derived является типичной.

Разрушение выполняется из Derived -> Base.

Почему?

  • Производные могут по-прежнему использовать ресурсы, выделенные Базой во время уничтожения.

    • Если База была уничтожена первой, эти ресурсы не будутбольше доступно для Производных.
  • Каждый уровень иерархии должен отвечать за освобождение любых ресурсов, выделенных этим уровнем.

    • Базане мог освободить ресурсы Производного класса, о которых он не знает.
    • Производные также не должны быть доступны для ресурсов, выделенных Базой.
      • При строгом ООП производные не должны даже знать детали этих ресурсов или каким образом они выделяются или освобождаются.

Чтобы ответить на его конкретные пункты:

  • Исключение в базе
    • Исключений не должнобыть брошенным в деструкторы (В частности, в C # это по крайней мере один раз может убить сборщик мусора)
  • Производные классы содержат члены базового класса
    • У объекта есть один экземплярлюбого члена данных.Не по одному на уровень иерархии.
      Поэтому мы возвращаемся к тому, что база освобождает ресурсы, связанные с элементом данных, она больше не будет доступна для использования классом Derived.

К вашему объяснению для обоснования заказа.Если мы предположим, что порядок Derived-> Base правильный, это объясняет, почему вы все равно должны вызывать деструктор Base, а не то, почему Derived стоит первым.
Если опасения, касающиеся порядка, были другими, и уничтожение было завершено, Base->Получив затем, мы сможем считать объект полностью разрушенным после завершения деривата, поскольку разрушение произошло бы на всех уровнях.

0 голосов
/ 14 октября 2011

Важно понимать, что строительство объекта происходит поэтапно.Если у вас есть класс B, производный от A, вы строите B, сначала создав A, а затем превратив A в B. Аналогично, B уничтожается, сначала превращая его в A, а затем уничтожая A. Это обеспечиваеточень последовательный способ мышления о создании и разрушении объекта.

...