正如其他人所写,没有歧义,因为Derived::f(int)
hides Base::f(int)
。您可能期望只有在没有using
声明的情况下才会出现这种情况:
using Base::f;
但隐藏仍然适用。C++11 标准的第 7.3.3/15 段规定:
当using-declaration将基类中的名称带入派生类范围时,派生类中的成员函数和成员函数模板会覆盖和/或隐藏具有相同名称的成员函数和成员函数模板,parameter-type-list (8.3 .5)、cv-qualification和ref-qualifier(如果有)在基类中(而不是冲突)。
它还提供了一个与您的示例非常相似的示例(请参阅表达式如何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)
}