Определите, что напечатает программа с классами и наследованием

Вывод будет A1:B:A2:C:~C:~A2:~B:~A1:. Сначала создаются базовая часть и её поля, затем поля производного класса и его тело; разрушение идёт в обратном порядке.

Короткий ответ

Что ответить на собеседовании

Вывод будет A1:B:A2:C:~C:~A2:~B:~A1:. Сначала создаются базовая часть и её поля, затем поля производного класса и его тело; разрушение идёт в обратном порядке.

Подробный разбор

Ответ с пояснениями

Условие

Укажите, какой вывод будет получен при запуске следующего кода.

#include <iostream>

struct A1 {
    A1() {
        std::cout << "A1:";
    }
    ~A1() {
        std::cout << "~A1:";
    }
};

struct A2 {
    A2() {
        std::cout << "A2:";
    }
    ~A2() {
        std::cout << "~A2:";
    }
};

class B {
public:
    B() {
        std::cout << "B:";
    }
    ~B() {
        std::cout << "~B:";
    }

private:
    A1 a;
};

class C : public B {
public:
    C() {
        std::cout << "C:";
    }
    ~C() {
        std::cout << "~C:";
    }

private:
    A2 a;
};

int main() {
    C c;
}

Ответ

Вывод будет A1:B:A2:C:~C:~A2:~B:~A1:. Сначала создаются базовая часть и её поля, затем поля производного класса и его тело; разрушение идёт в обратном порядке.

Для B сначала создаётся поле a типа A1, затем выполняется тело B. После этого создаётся поле C::a типа A2 и выполняется тело C.

При выходе из main сначала работает тело ~C, затем уничтожается его поле A2, затем тело ~B и поле A1. Здесь объект C автоматический и уничтожается как C, поэтому невиртуальный деструктор B сам по себе не создаёт проблемы.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее