Почему в выражении нет двусмысленности 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);
}
Как написали другие, нет никакой двусмысленности, потому что 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)
}
Функция в производном классе скрывает функцию в базовом классе.
Это называется слежка.
Потому что статический тип d
является Derived
, а также Derived::f(int)
шкуры Base::f(int)
,