2010-11-19 10 views
6

Un puntatore a funzione di una funzione membro della classe che è dichiarato virtuale è valido?Un puntatore a una funzione virtuale viene ancora richiamato virtualmente?

class A { 
public: 
    virtual void function(int param){ ... }; 
} 

class B : public A { 
    virtual void function(int param){ ... }; 
} 

//impl : 
B b; 
A* a = (A*)&b; 

typedef void (A::*FP)(int param); 
FP funcPtr = &A::function; 
(a->*(funcPtr))(1234); 

Sarà B::function essere chiamato?

+2

Hai il codice. Questa è una di quelle domande a cui potresti aver risposto da solo eseguendo il codice. –

+0

perché è più veloce chiedersi qui che accendere IDE, creare progetti, codice, compilare, eseguire il debug, ecc ... e darebbe un vantaggio ad altri, e questa domanda/codice non andrà persa. – uray

+2

@ Martin: E se il comportamento fosse indefinito? –

risposta

2

Sì. Funziona anche con l'ereditarietà virtuale.

+2

Amo C++ !!!! – uray

5

Sì. codice valido per testare sul codepad o ideone:

class A { 
public: 
    virtual void function(int param){ 
     printf("A:function\n"); 
    }; 
}; 

class B : public A { 
public: 
    virtual void function(int param){ 
     printf("B:function\n"); 
    }; 
}; 

typedef void (A::*FP)(int param); 

int main(void) 
{ 
    //impl : 
    B b; 
    A* a = (A*)&b; 

    FP funcPtr = &A::function; 
    (a->*(funcPtr))(1234); 
} 
0

La funzione sarà chiamato, come hai appena tenta di richiamare la funzione ereditata.

0

Il test migliore per quella cosa è rendere i metodi nella classe A un metodo virtuale puro. In entrambi i casi (con o senza metodi virtuali puri), verrà chiamata la funzione B ::.

Problemi correlati