İsim arama, aşırı yük çözünürlüğü için ayrı bir fazdır.
Önce ad arama işlemi gerçekleştirilir. Bu, ismin hangi kapsamın geçerli olduğuna karar verme sürecidir. Bu durumda, d.foo
'un d.D::foo
veya d.B1::foo
veya d.B2::foo
anlamına mı karar vermesi gerekir. İsim arama kuralları, işlev parametrelerini veya herhangi bir şeyi dikkate almaz; sadece isimler ve kapsamlar ile ilgili.
Yalnızca bu karar verildikten sonra, adın bulunduğu yerde işlevdeki farklı aşırı yüklenmeler üzerinde aşırı yük çözünürlüğü uygularız mı?
Örneğinizde, böyle bir işlev varsa, numaralı telefonu arayarak D::foo()
numaralı telefonu bulabilirsiniz. Ama hiç yok. Böylece, kapsamları geriye doğru çalıştırarak, temel sınıfları dener. Artık foo
, B1::foo
veya B2::foo
'a eşit olarak bakabiliyor, bu yüzden belirsiz.
Aynı nedenden dolayı, D
üye işlevinin içinde belirsizliği olan foo(5);
'u belirsiz kılmaya çalışırsınız.
önerilen çözümün etkisi:
struct Derived : public Base1, public Base2{
using Base1::foo;
using Base2::foo;
bu adı D::foo
oluşturur ve iki işlevi tespit sağlamasıdır. Sonuç, d.foo
'un d.D::foo
'a çözüldüğü ve daha sonra D::foo
tarafından tanımlanan bu iki işlevde aşırı yüklenmenin ortaya çıkabileceğidir.
Not: Bu örnekte D::foo(int)
ve Base1::foo(int)
, bir işlev için iki tanımlayıcıdır; ama genel olarak, isim arama ve aşırı yükleme çözümleme işlemi için, iki ayrı işlev olup olmadıkları fark etmez.
iki foo (ikinci durumda) içinde hangi işlevin çağrıldığını sabitlemek için günlüğe kaydetme ifadeleri eklerseniz, şaşıracaksınız ... C++, arcane kuralıyla dolu;) –
@Matthieu: * gasp *! Lanet kuralları saklıyor. :( – Xeo