Wikipedia Zitat:
Die Überschreibung spezielle Kennung bedeutet, dass der Compiler die Basisklasse überprüfen (es) um zu sehen, ob es eine virtuelle Funktion mit genau dieser Signatur gibt. Und wenn nicht, wird der Compiler fehlschlagen.
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
Edit (Versuch, ein bisschen die Antwort zu verbessern):
ein Verfahren als „überschreiben“ Deklarieren bedeutet, dass das Verfahren soll eine (virtuelle) Methode auf die neu zu schreiben Basisklasse. Die überschreibende Methode muss dieselbe Signatur (zumindest für die Eingabeparameter) haben wie die Methode, die neu geschrieben werden soll.
Warum ist das notwendig? Nun, die folgenden zwei häufigen Fehlerfälle werden verhindert:
man vertippt einen Typ in der neuen Methode. Der Compiler, der nicht weiß, dass er eine frühere Methode schreiben möchte, fügt sie einfach als neue Methode zur Klasse hinzu. Das Problem ist, dass die alte Methode immer noch da ist, die neue wird nur als Überladung hinzugefügt. In diesem Fall funktionieren alle Aufrufe in Richtung der alten Methode genauso wie zuvor, ohne irgendeine Änderung im Verhalten (was der Zweck des Umschreibens gewesen wäre).
man vergisst, die Methode in der Oberklasse als "virtuell" zu deklarieren, versucht aber immer noch, sie in eine Unterklasse zu schreiben. Während dies scheinbar akzeptiert wird, wird das Verhalten nicht genau so sein wie beabsichtigt: Die Methode ist nicht virtuell, so dass der Zugriff durch Zeiger auf die Oberklasse den Aufruf der alten (Oberklassen-) Methode anstelle der neuen (Unterklassen-) Methode beendet.
„überschreibt“ deutlich disambiguiert dies hinzu: Dadurch wird man die Compiler zu sagen, dass drei Dinge erwarten:
- es in der übergeordneten Klasse
- dies ein Verfahren, mit dem gleichen Namen Methode in der Oberklasse wird als "virtual" deklariert (das heißt, umgeschrieben werden soll)
- die Methode in der Oberklasse hat die gleiche (Eingabe *) Signatur wie die Methode in der Unterklasse (die Neuschreibmethode)
Wenn einer dieser Werte falsch ist, wird ein Fehler gemeldet.
* Hinweis: Der Ausgabeparameter ist manchmal von verschiedenen, aber verwandten Typ. Lesen Sie bei Interesse über kovariante und kontravariante Transformationen.
Ja. –
Es ist jedoch keine Doppelprüfung. Es ist der einzige Check. –
@Nikos guter Punkt;), behoben – aiao