Si consideri il seguente codice C++:Puntatori alle funzioni dei membri virtuali. Come funziona?
class A
{
public:
virtual void f()=0;
};
int main()
{
void (A::*f)()=&A::f;
}
Se avessi a indovinare, direi che & A :: F in questo contesto significherebbe "l'indirizzo della realizzazione di una di f()", poiché non esiste una separazione esplicita tra i puntatori alle funzioni membro regolari e le funzioni membro virtuali. E dal momento che A non implementa f(), sarebbe un errore di compilazione. Tuttavia, non lo è.
E non solo. Il seguente codice:
void (A::*f)()=&A::f;
A *a=new B; // B is a subclass of A, which implements f()
(a->*f)();
chiamerà effettivamente B :: f.
Come mai?
Perché il compilatore consente di farlo! Se chiamare un metodo normale non è diverso dal chiamare un metodo virtuale, perché pensi che il codice sia diverso quando si usano i puntatori del metodo. Secondo te, il compilatore sta traducendo le normali chiamate di metodo (virtuali e ordinate)? –