Ponteiros para funções de membros virtuais. Como funciona?

Considere o seguinte código C ++:

class A
{
public:
      virtual void f()=0;
};


int main()
{
     void (A::*f)()=&A::f;
}

Se eu tivesse que adivinhar, eu diria que & A :: f neste contexto significaria "o endereço da implementação de f ()", já que não há separação explícita entre ponteiros para funções membro regulares e funções de membros virtuais . E como A não implementa f (), isso seria um erro de compilação. No entanto, não é.

E não só isso. O código a seguir:

void (A::*f)()=&A::f;
A *a=new B;            // B is a subclass of A, which implements f()
(a->*f)();

vai realmente chamar B :: f.

Como isso acontece?

questionAnswers(3)

yourAnswerToTheQuestion