C++: порядок завершения объекта производного класса
Я знаю, что порядок завершения объекта класса следующий:
- Выполнить тело деструктора
- Уничтожить объект (т.е. освободить память, используемую для элементов данных)
Теперь меня спросили о порядке завершения для объектов производного класса. Я предполагаю, что это точно то же самое, но вызывается ли деструктор объекта базового класса после выполнения вышеуказанных шагов?
Я так не думаю, но хотел быть уверенным на экзамене.
Спасибо за вашу помощь:)
1 ответ
Деструкторы вызываются в обратном порядке построения. Это означает, что деструктор базового класса будет автоматически вызываться после деструктора производного класса.
Возьмите этот пример:
class Foo
{
protected:
SomeType var;
public:
~Foo() {}
};
class Baz : public Foo
{
public:
~Baz()
{
var.doSomething();
}
};
Если бы деструктор базового класса Foo был вызван раньше, чем деструктор класса Baz, тогда объект var был бы уничтожен (его деструктор был бы автоматически вызван при уничтожении Foo), и вы вошли бы в область неопределенного поведения.
Это простое и интуитивно понятное объяснение того, почему деструкторы называются так.