Punteros a funciones miembro virtuales. ¿Como funciona?
Considere el siguiente código de C ++:
class A
{
public:
virtual void f()=0;
};
int main()
{
void (A::*f)()=&A::f;
}
Si tuviera que adivinar, diría que & A :: f en este contexto significaría "la dirección de la implementación de A de f ()", ya que no hay una separación explícita entre los punteros a las funciones miembro regulares y las funciones miembro virtuales . Y como A no implementa f (), eso sería un error de compilación. Sin embargo, no lo es.
Y no solo eso. El siguiente código:
void (A::*f)()=&A::f;
A *a=new B; // B is a subclass of A, which implements f()
(a->*f)();
en realidad llamará B :: f.
¿Cómo sucede?