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