2016-03-24 15 views
4

Ich verstehe den Zweck der C++ override, aber bin ein bisschen verwirrt durch seine Implementierung im Vergleich zu anderen höheren Sprachen, wo seine Verwendung standardmäßig erforderlich ist.Warum ist das Überschreiben in C++ optional?

Die C++11 wiki page beschreibt es als "technisch Bezeichner für Deklaratorattribut", aber nicht ausführlich, warum es nicht einfach ein Schlüsselwort für die Sprache ist.

+1

Das Hinzufügen von 'override' als Schlüsselwort kann (alte) Codes, die es als Bezeichner verwenden, unterbrechen. – Jarod42

+0

"[override gains] spezielle Bedeutung als Attribute nur dann, wenn sie in bestimmten spezifischen [attributes] Kontexten verwendet wird" – user2864740

+0

Es ist optional, weil viele Leute glauben, dass es mehr Komplikationen verursacht, als es verrechnet. –

Antwort

8

Es ist optional, Rückwärtskompatibilität mit C++ 03 aufrechtzuerhalten. Wenn es nicht optional wäre, wäre der gesamte Code * kaputt gegangen.

In ähnlicher Weise hätte override ein Schlüsselwort jeden Code, der den Namen override verwendet, gebrochen.


OK, nicht wörtlich alle der Code, aber eine Menge davon.

+1

Ah, ich wusste nicht, dass die Rückwärtskompatibilität mit C++ 11 ein so hohes Ziel war, aber es ist [wörtlich das erste Entwurfsziel] (https://en.wikipedia.org/wiki/C%2B%2B11 #Design_goals), die der Ausschuss aufgeführt hat. – nonathaj

+0

@nonathaj Ja, wenn es nicht wäre, wäre C++ sehr viel weniger schrecklich :-) – juanchopanza

+1

Einige Compiler, wie Clang werden feststellen, dass "Sie' override "in Ihrem Code verwenden. Ich warne dich, wenn es an anderen Orten fehlt ". Mit anderen Worten, es versucht, einen konsistenten Gebrauch davon durchzusetzen. –

3

Technisch gesehen verhält sich C++ 11 hier nicht sehr anders als Java (was ein typisches Beispiel für eine der "anderen höheren Programmiersprachen" ist, die Sie erwähnen). A falschoverride wird ein Kompilierungsfehler, genau wie ein falscher @Override in Java. Ein fehlenderoverride wird kein Kompilierungsfehler sein, genauso wie ein fehlender @Override kein Kompilierungsfehler in Java sein wird. Der einzige wirkliche Unterschied, den ich sehen kann, ist, dass Java-Tools traditionell eine bessere Unterstützung haben, um eine fehlende @Override zu entdecken, und dass Java-Benutzer traditionell dazu ermutigt werden, die entsprechende Warnung als Fehler zu behandeln, während C++ - Compiler ziemlich langsam waren weit zu hinzufügen, Warnoptionen für fehlende override s.

Aber wir kommen dorthin; Clang hat jetzt -Winconsistent-missing-override, und neuere GCCs haben -Wsuggest-override. Alles, was Sie tun müssen, ist diese Warnungen zu aktivieren und sie als Fehler zu behandeln, entweder zwangsweise durch den Compiler oder einfach durch Konvention.

Warum ist es nicht einfach ein Schlüsselwort: Rückwärtskompatibilität mit älterem Code.

Verwandte Themen