Вывод будет 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 сам по себе не создаёт проблемы.