2

d.f(1);为什么下面的表达式在andmain()之间没有歧义?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);
}
4

3 回答 3

3

正如其他人所写,没有歧义,因为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-qualificationref-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)
}
于 2013-07-11T20:04:32.857 回答
2

派生类中的函数隐藏了基类中的函数。
这称为阴影。

于 2013-07-11T19:52:47.117 回答
1

因为 的静态类型dDerived, 和Derived::f(int) hides Base::f(int)

于 2013-07-11T19:53:47.800 回答