Aşağıdaki C++ kodunu göz önünde bulundurun:İşaretçiler sanal üye işlevlerine. O nasıl çalışır?
class A
{
public:
virtual void f()=0;
};
int main()
{
void (A::*f)()=&A::f;
}
Tahmin etmem gerekirse, & A :: f bu bağlamda "a (f) 'nin (A) uygulanmasının adresi" Düzenli üye işlevleri ve sanal üye işlevleri için işaretçiler arasında açık bir ayrım yoktur. Ve A, f() öğesini uygulayamadığı için, bu bir derleme hatası olur. Ancak, öyle değil.
Ve sadece bu değil. Aşağıdaki kod:
void (A::*f)()=&A::f;
A *a=new B; // B is a subclass of A, which implements f()
(a->*f)();
aslında B :: f.
Bu nasıl olur?
Çünkü derleyici bunu yapar! Normal bir yöntemi çağırmak, sanal bir yöntemi çağırmaktan farklı değilse, yöntem işaretçisini kullanırken kodun neden farklı olduğunu düşünüyorsunuz? Derleyicinin normal yöntem (sanal ve ordingary) çağrılarını nasıl çevirdiğini düşünüyorsunuz? –