Rozważmy następujący kod C++:Wskaźniki do funkcji wirtualnego członka. Jak to działa?
class A
{
public:
virtual void f()=0;
};
int main()
{
void (A::*f)()=&A::f;
}
Gdybym miał zgadywać, powiedziałbym, że & A :: f w tym kontekście oznaczałoby „adres wdrażania A w f()”, ponieważ nie ma wyraźnej separacji między wskaźnikami do zwykłych funkcji składowych i funkcji wirtualnego elementu. A ponieważ A nie implementuje f(), byłby to błąd kompilacji. Jednak tak nie jest.
I nie tylko to. Poniższy kod:
void (A::*f)()=&A::f;
A *a=new B; // B is a subclass of A, which implements f()
(a->*f)();
będzie faktycznie wywoływać B :: f.
Jak to się dzieje?
Ponieważ kompilator tak się dzieje! Jeśli wywołanie zwykłej metody nie różni się od wywoływania metody wirtualnej, dlaczego uważasz, że kod jest inny, gdy używasz wskaźników metod? Jak sądzisz, w jaki sposób kompilator tłumaczy normalne wywołania metody (wirtualne i wywołujące)? –