2012-04-03 13 views
7

Ich habe diesen Code:Virtuelle Funktionen überschreiben und versteckt

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

Wenn ich den Code dies zu ändern:

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

ich gelesen, dass dies mit der Funktion überwiegendes verbunden ist und sich versteckt, aber immer noch doesn‘ Ich verstehe das Verhalten in diesem Code.

+3

Viele Dinge sind falsch mit dem Code. Für den Anfang sollten die Funktionsargumente * Referenzen * sein. –

+0

Warum Referenzen? – user152508

+2

Wegen (a) Schneiden und (b) einer unnötigen Kopie. – ipc

Antwort

9

Funktion Überlastung arbeiten nicht auf der Grundlage der Laufzeit Typ der Argumente (die für Ihr Argument hier ist CustomHandler*), sondern vielmehr auf ihre statischen Typ (die hier Handler*, wie das ist, was handler wie erklärt wird) .

Mit virtuellen Funktionen können Sie Funktionsaufrufe auf Basis des Laufzeittyps ein Objekt (das Sie die Funktion aufrufen) ausführen. Das Absetzen von Aufrufen basierend auf dem Laufzeittyp mehrerer Objekte wird als Mehrfachversand bezeichnet. In diesem Fall sprechen wir über den häufigsten Fall von double dispatch. Wenn Sie diese Funktionalität wünschen, müssen Sie den doppelten Versand implementieren oder eine Bibliothek verwenden, die dies für Sie erledigt.

Die Visitor pattern ist eine ziemlich übliche Art, die Implementierung durchzuführen; siehe auch Difference betwen Visitor pattern & Double Dispatch.

Schließlich können Sie eine gute Diskussion des Besuchers finden, der Beispielcode einschließt (nach unten scrollen) here.

+0

+1 du hast geschrieben was ich beantworten wollte. außer dass ich geplant hatte, ein konkretes Beispiel für Besuchermuster aufzunehmen. fügen Sie bitte das –

+0

@ Cheersandthth.-Alf hinzu: Fügte einen Link hinzu, der gut gehen sollte. Ich wollte kein Inline-Beispiel hinzufügen (zu viel Boilerplate). – Jon

Verwandte Themen