Почему в выражении `d.f (1);` ниже в main () нет никакой двусмысленности?

Почему в выражении нет двусмысленности d.f(1); ниже в main() между Base::f(int) а также Derived::f(int) ?

class Base
{
public:
void f(int i) {}
void f(int i, int j) {}
};

class Derived : public Base
{
public:
using Base::f;
void f(int i) {}
};

int main()
{
Derived d;
d.f(1);
}

2

Решение

Как написали другие, нет никакой двусмысленности, потому что Derived::f(int) шкуры Base::f(int), Вы, вероятно, ожидали, что это будет иметь место только в отсутствие using объявление:

using Base::f;

Но сокрытие все еще применяется. Пункт 7.3.3 / 15 стандарта C ++ 11 определяет:

Когда используя декларирование приносит имена из базового класса в область производного класса, функции-члены а также
шаблоны функций-членов в производном классе переопределяют и / или скрывают функции-члены и функция-член
шаблоны с тем же именем, Параметр типа-лист (8.3.5), резюме квалификация, а также реф-классификатор (если есть) в
базовый класс (а не противоречивый).

Он также предоставляет пример, очень похожий на ваш (посмотрите, как выражение p->f(1) не приводит к двусмысленности, и D::f выбран вместо):

struct B {
virtual void f(int);
virtual void f(char);
void g(int);
void h(int);
};

struct D : B {
using B::f;
void f(int); // OK: D::f(int) overrides B::f(int);
using B::g;
void g(char); // OK
using B::h;
void h(int); // OK: D::h(int) hides B::h(int)
};

void k(D* p)
{
p->f(1); // calls D::f(int)
p->f(’a’); // calls B::f(char)
p->g(1); // calls B::g(int)
p->g(’a’); // calls D::g(char)
}
3

Другие решения

Функция в производном классе скрывает функцию в базовом классе.
Это называется слежка.

2

Потому что статический тип d является Derived, а также Derived::f(int) шкуры Base::f(int),

1