Перекрытие методов в классе

286
19 декабря 2016, 20:08
struct A
{
        void f(int);
};
struct B : A
{
        void f(long);
};
B b;
b.f(1);

Почему void f(long) перекрыл void f(int)? Я думал, что прототип функции производного класса должен полностью соответствовать прототипу функции базового, то есть для перекрытая этой функции нужно не только одинаковое имя самой функции, а и тоже самое количество и тип параметров. Почему тогда в данном коде не overloading, а override?

Answer 1

Так устроен с++. Это на первых порах вводит всех в ступор. Нужно понимать, как происходит поиск подходящей функции. Вначале просмартивается класс на наличие подходящих функций. И только если они не находятся, начинается просмотр функций родителя. так как 1 можно без проблем преобразовать в long, то и будет вызвана функция void f(long);

Если интересны детали, читайте в стандарте в пункте 13.2 (Declaration matching).

READ ALSO
Область применения Си и Си++

Область применения Си и Си++

Хотелось бы узнать каковы области применения языков Си и Си++ и для каких платформ чаще их используют?

311
Скачивание файла с FTP сервера

Скачивание файла с FTP сервера

Добрый вечер! Помогите понять почему не скачивается файл с FTP сервера

393
Запись в файл на С++ результатов запроса к postgres базе

Запись в файл на С++ результатов запроса к postgres базе

Производится чтение из базы даннных слов и имен файлов (которые содержат эти слова) и запись их в текстовый файл в следующем формате: файл...

302
Подскажите пожалуйста с чем может быть связана ошибка при пересылке данных?

Подскажите пожалуйста с чем может быть связана ошибка при пересылке данных?

Разрабатываю клиент серверное приложение и в нем возникает ошибка при пересылке данныхЗаключается она в следующем:

302