Вывод по строкам: A(), B(), PrintB, ~B(), ~A(). Привязка временного B к локальной const A& продлевает жизнь всего временного объекта до конца области видимости ссылки.
Какой вывод получит программа при её выполнении
Вывод по строкам: A(), B(), PrintB, ~B(), ~A(). Привязка временного B к локальной const A& продлевает жизнь всего временного объекта до конца области видимости ссылки.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой текст появится в консоли после запуска следующей программы.
#include <cstdint>
#include <iostream>
class A
{
public:
A() { std::cout << "A()" << std::endl; }
virtual ~A() { std::cout << "~A()" << std::endl; }
virtual void Print() const { std::cout << "PrintA" << std::endl; }
};
class B : public A
{
public:
B() { std::cout << "B()" << std::endl; }
virtual ~B() { std::cout << "~B()" << std::endl; }
virtual void Print() const { std::cout << "PrintB" << std::endl; }
};
int main()
{
const A& ref = B();
ref.Print();
return 0;
}
Ответ
Вывод по строкам: A(), B(), PrintB, ~B(), ~A(). Привязка временного B к локальной const A& продлевает жизнь всего временного объекта до конца области видимости ссылки.
Сначала конструируется базовая часть A, затем B. Вызов Print виртуальный, поэтому через ссылку выполняется переопределение B::Print.
При выходе из main временный объект уничтожается в обратном порядке: сначала B, затем A. Ссылка здесь не создаёт копию A и не вызывает срезку производной части. Правило продления жизни не следует автоматически переносить на ссылки, возвращаемые из функций.