Какой вывод получит программа при её выполнении

Вывод по строкам: 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 и не вызывает срезку производной части. Правило продления жизни не следует автоматически переносить на ссылки, возвращаемые из функций.

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

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

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

Подробнее