2012-04-03 14 views
7

que tienen este código:funciones virtuales de primer orden y se esconden

class Event{}; 
class CustomEvent:public Event{}; 

class Handler 
{ 
    public: 
     virtual void inform(Event e){} 
}; 

class CustomHandler : public Handler 
{ 
    public: 
    void inform(CustomEvent e){}   

}; 

CustomEvent cEvent; 
Handler* handler = new CustomHandler; 

//this calls Handler::inform(Event), not CustomHandler::(CustomEvent) , as I expected 
handler->inform(cEvent); 

Si cambio el código para esto:

class Handler 
{ 
    public: 
     virtual void inform(Event e){} 
     virtual void inform(CustomEvent e){} 

}; 

class CustomHandler : public Handler 
{ 
    public: 
    void inform(CustomEvent e){}   

}; 

CustomEvent cEvent; 
Handler* handler = new CustomHandler; 

//this calls CustomHandler::(CustomEvent) 
handler->inform(cEvent); 

leí que esto está relacionado con la primordial función y escondido, pero todavía doesn' Entiendo el comportamiento en este código.

+3

Muchas cosas están mal con el código. Para empezar, los argumentos de la función deberían ser * referencias *. –

+0

¿Por qué referencias? – user152508

+2

debido a (a) rebanar y (b) una copia innecesaria. – ipc

Respuesta

9

sobrecarga función no se basa en la tiempo de ejecución tipo de los argumentos (que para su argumento aquí es CustomHandler*), sino más bien en su estática tipo (que aquí es Handler*, ya que es lo handler se declara como) .

Las funciones virtuales le permiten realizar llamadas a funciones basadas en el tipo de tiempo de ejecución un objeto (al que llama la función). El envío de llamadas en función del tipo de tiempo de ejecución de múltiples objetos se denomina despacho múltiple; en este caso estamos hablando del caso más común de double dispatch. Si desea este tipo de funcionalidad, deberá implementar el envío doble o utilizar una biblioteca que lo haga por usted.

El Visitor pattern es una forma bastante común de realizar la implementación; ver también Difference betwen Visitor pattern & Double Dispatch.

Finalmente, puede encontrar una buena discusión de Visitor que incluye código de ejemplo (scroll down) here.

+0

+1 escribiste lo que intentaba responder. excepto que planeé incluir un ejemplo concreto de patrón de visitante. por favor agregue que –

+0

@ Cheersandhth.-Alf: Agregó un enlace que debería estar bien. No quería agregar un ejemplo en línea (demasiado repetitivo). – Jon

Cuestiones relacionadas