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

Программа выведет A: функция f не виртуальная, поэтому вызов через ссылку типа A& выбирает A::f. Фактический тип объекта B не меняет этот выбор.

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

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

Программа выведет A: функция f не виртуальная, поэтому вызов через ссылку типа A& выбирает A::f. Фактический тип объекта B не меняет этот выбор.

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

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

Условие

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

class A {
public:
    void f() { std::cout << "A"; }
};

class B : public A {
public:
    void f() { std::cout << "B"; }
};

void g(A &a) { a.f(); }

int main() {
    B b;
    g(b);
}

Ответ

Программа выведет A: функция f не виртуальная, поэтому вызов через ссылку типа A& выбирает A::f. Фактический тип объекта B не меняет этот выбор.

Ссылка в g обращается к тому же объекту, то есть срезки объекта здесь нет. Причина результата — статическое связывание невиртуальной функции, а B::f скрывает имя функции базового класса.

Если объявить в A virtual void f(), а в B — void f() override, вызов через A& будет динамическим и напечатает B. Исходный код не добавляет перевод строки.

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

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

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

Подробнее