2010-11-19 15 views
6

Será un puntero de función a una función miembro de la clase que se declara virtual de ser válido?¿Todavía se invoca un puntero a una función virtual de forma virtual?

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); 

¿Se llamará B::function?

+2

tiene el código. Esta es una de esas preguntas que podría haber respondido usted solo con ejecutar el código. –

+0

porque es más rápido preguntar aquí que arrancar IDE, crear proyecto, codificar, compilar, depurar, etc. ... y daría beneficio a otros, y esta pregunta/código no se perderá. – uray

+2

@Martin: ¿Qué pasa si el comportamiento no está definido? –

Respuesta

2

Sí. También funciona con herencia virtual.

+2

Me encanta C++ !!!! – uray

5

Sí. código válido para probar en 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 función se llamará, como usted acaba de intentar invocar la función heredada.

0

La mejor prueba para esa cosa es hacer que los métodos de la clase A un método virtual puro. En ambos casos (con o sin métodos virtuales puros), se llamará a la función B ::.

Cuestiones relacionadas