C++: порядок завершения объекта производного класса

Я знаю, что порядок завершения объекта класса следующий:

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

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

Я так не думаю, но хотел быть уверенным на экзамене.

Спасибо за вашу помощь:)

1 ответ

Решение

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

Возьмите этот пример:

class Foo
{
protected:
    SomeType var;

public:
    ~Foo() {}
};

class Baz : public Foo
{
public:
    ~Baz()
    {
        var.doSomething();
    }
};

Если бы деструктор базового класса Foo был вызван раньше, чем деструктор класса Baz, тогда объект var был бы уничтожен (его деструктор был бы автоматически вызван при уничтожении Foo), и вы вошли бы в область неопределенного поведения.

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

Другие вопросы по тегам