Bunun nedeni, üslerinizden birinde bir ad bulursa ad aramanın durmasıdır. Diğer üslerde ötesine bakmayacak. B'deki işlev, A'daki işlevi gölgeler . A'nın işlevini B kapsamında yeniden bildirmeniz gerekir, böylece her iki işlev de B ve C içinden görülebilir:
class A
{
public:
void foo(string s){};
};
class B : public A
{
public:
int foo(int i){};
using A::foo;
};
class C : public B
{
public:
void bar()
{
string s;
foo(s);
}
};
Düzenleme: Standardın verdiği gerçek açıklama (10.2 / 2'den itibaren):
Aşağıdaki adımlar, bir sınıf kapsamındaki ad aramasının sonucunu tanımlar, C. İlk olarak, sınıftaki ve temel sınıf alt nesnelerinin her birindeki ad için her bildirim dikkate alınır. Bir alt nesne B'deki bir üye adı f, eğer A, B'nin temel sınıf alt nesnesiyse, bir alt nesnede f üye adını gizler. Bir kullanma bildirimi ile sunulan bu bildirimlerin her biri, kullanım bildirimi ile belirtilen bildirimi içeren türdeki C'nin her bir alt nesnesinden olduğu kabul edilir. 96) Sonuçta ortaya çıkan bildirimler hepsi aynı türden alt nesnelerden veya setin statik olmayan bir üyesi var ve farklı alt nesnelerden üyeler içeriyor, bir belirsizlik var ve program kötü biçimlendirilmiş. Aksi takdirde, bu küme aramanın sonucudur.
Başka bir yerde (hemen üstünde) söyleyecekleri şudur:
Bir id ifadesi için [ "foo" gibi bir şey ], bunun sınıf kapsamında ad araması başlar; nitelenmiş bir kimlik için [ "A :: foo" gibi bir şey, A iç içe geçmiş bir ad belirticidir ], ad araması, iç içe geçmiş ad belirticisi kapsamında başlar. Ad araması, erişim kontrolünden önce gerçekleşir (3.4, madde 11).
([...] benim tarafımdan belirlendi). Bunun, B'deki foo'nuz özel olsa bile, A'daki foo'nun hala bulunmayacağı anlamına gelir (çünkü erişim denetimi daha sonra gerçekleşir).