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?