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?

Respuestas a la pregunta(3)

Su respuesta a la pregunta