2

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);
}
4

3 に答える 3

3

Derived::f(int)他の人が書いているように、非表示なので曖昧さはありませんBase::f(int)usingおそらく、これは宣言がない場合にのみ当てはまると予想していました。

using Base::f;

ただし、非表示は引き続き適用されます。C++11 標準の 7.3.3/15 項では、次のように指定されています。

using-declarationが基底クラスの名前を派生クラスのスコープに持ち込む場合、派生クラスのメンバー関数メンバー関数テンプレートは、同じ名前のパラメーター型リスト(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)
}
于 2013-07-11T20:04:32.857 に答える
2

派生クラスの関数は、基本クラスの関数を隠します。
これをシャドウイングと呼びます。

于 2013-07-11T19:52:47.117 に答える
1

の静的型dDerived, and Derived::f(int) hides Base::f(int)であるためです。

于 2013-07-11T19:53:47.800 に答える