Программа выведет 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. Исходный код не добавляет перевод строки.