struct A
{
void f(int);
};
struct B : A
{
void f(long);
};
B b;
b.f(1);
Почему void f(long) перекрыл void f(int)? Я думал, что прототип функции производного класса должен полностью соответствовать прототипу функции базового, то есть для перекрытая этой функции нужно не только одинаковое имя самой функции, а и тоже самое количество и тип параметров. Почему тогда в данном коде не overloading, а override?
Так устроен с++. Это на первых порах вводит всех в ступор. Нужно понимать, как происходит поиск подходящей функции. Вначале просмартивается класс на наличие подходящих функций. И только если они не находятся, начинается просмотр функций родителя. так как 1 можно без проблем преобразовать в long, то и будет вызвана функция void f(long);
Если интересны детали, читайте в стандарте в пункте 13.2 (Declaration matching).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей