Потому что скрыто имя ;подпись не участвует.В соответствии с правилом поиска имени ,
поиска имени проверяет области, как описано ниже, пока не найдет хотя бы одно объявление любого вида, в этот момент поиск останавливается идальнейшие области не рассматриваются.
В этом случае, когда имя f
находится в области действия Parent
, поиск имени останавливается;имена в Grandparent
не будут рассматриваться вообще.(Кстати: после поиска имени в проверке разрешения перегрузки будет проверена подпись для выбора наилучшего совпадения)
Если это не то поведение, которое вы ожидали, вы можете ввести имена с помощью using
.
struct Parent : public Grandparent {
using Grandparent::f;
void f(int);
};
struct Child : public Parent {
void g() { f(2.14, 3.17); } // refer to Grandparent::f(double, double)
};