Consideremos el siguiente código C++:Punteros a funciones de miembros virtuales. ¿Como funciona?
class A
{
public:
virtual void f()=0;
};
int main()
{
void (A::*f)()=&A::f;
}
Si tendría que adivinar, diría que & A :: f en este contexto significaría "la dirección de aplicación de la f de A()", ya que no hay una separación explícita entre los punteros a las funciones de miembros regulares y las funciones de miembros virtuales. Y dado que 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)();
realmente llamará a B :: f.
¿Cómo sucede?
¡Porque el compilador lo hace posible! Si llamar a un método normal no es diferente de llamar a un método virtual, ¿por qué crees que el código es diferente cuando se utilizan punteros de método? ¿A qué crees que el compilador está traduciendo las llamadas al método normal (virtual y ordingary)? –