override
-Spezifikator davor, eine beabsichtigte virtuelle Basisfunktion zu überschreiben (weil die Signaturen nicht übereinstimmen). final
-Spezifikator schützt vor unbeabsichtigtem Überschreiben einer Funktion in einer abgeleiteten Klasse. = & gt; Gibt es einen Bezeichner (etwas wie vielleicht first
oder no_override
), das vor dem Überschreiben einer unbekannten Basisfunktion schützt?
Ich möchte einen Compilerfehler erhalten, wenn eine virtuelle Funktion zu einer Basisklasse mit derselben Signatur wie eine bereits vorhandene virtuelle Funktion in einer abgeleiteten Klasse hinzugefügt wurde.
EDIT 4 : Um diese Frage einfach zu halten und relevante Antworten zu erhalten, hier ist wieder das
ursprünglicher Pseudocode
class B : A
hat private: virtual void fooHasBeenDone() = 0;
class C : B
implementiert private: virtual void fooHasBeenDone() override { react(); }
class A
eine neue private: virtual void fooHasBeenDone();
A::foo
könnte etwas anderes sein als das ursprüngliche B::foo
. und ein spezifisches Beispiel
class B : A
hat virtual void showPath() = 0;
einen PainterPath class C : B
implementiert virtual void showPath() override { mPath.setVisible(); }
class A
eine neue virtual void showPath();
, was einen Dateipfad Natürlich ist das falsch, und ich sollte dann B::showPath()
in B::showPainterPath()
umbenennen und auch B::showPath() override
implementieren. Ich möchte nur vom Compiler informiert werden.
Hier ist ein kompilierendes reales Beispiel :
%Vor%Führen Sie es aus und sehen Sie sich die Textausgabe an.
Als Referenz ein älteres Beispiel mit einem bestimmten Anwendungsfall (PainterPath-Instanz):
Ссылка (der Link ist möglicherweise abgelaufen)
Diese Antwort ist Community-Wiki, weil es alle anderen Antworten kombiniert. Bitte upvote die spezifische Antwort, die für Sie hilfreich war, sowie diese.
first
oder no_override
. (Antwort)
override
Bezeichner so oft wie möglich. Q_DECL_OVERRIDE
, das zu override
erweitert wird, falls verfügbar. override
warnen: -Winconsistent-missing-override
und neuere GCCs haben -Wsuggest-override
. "final
hinzufügen. (antworten) final
erneut entfernen. ... Ich denke, ich werde anfangen, erste virtuelle Funktionen als DECL_FIRST
zu markieren. Vielleicht wird es in Zukunft eine compilerunabhängige Möglichkeit geben, dies zu überprüfen.
Die Möglichkeit von Spezifizierern wie first
oder no_override
ist nicht als solche vorhanden. Wahrscheinlich, weil es Verwirrung stiften kann. Es kann jedoch trivial erreicht werden, indem der Ansatz geändert wird.
Man sollte jede neue Methode in der Basisklasse mit final
specifier hinzufügen. Dies wird dazu beitragen, den Compilerfehler für alle übereinstimmenden Signaturen zu erhalten. Dadurch werden die nachfolgenden abgeleiteten Klassenverfahrensignaturen automatisch als "erste" ihrer Art festgelegt. Später kann das Schlüsselwort final
entfernt werden , da es nur für die "Überprüfung aus erster Hand" gedacht war.
Putting & amp; Das Entfernen des Schlüsselworts final
nach der neu hinzugefügten Basismethode ähnelt analog dem Kompilieren der Binärdatei mit der Option debug ( g++ -g
), die Ihnen hilft, den Fehler zu beheben. In der Produktion wird die Debug-Option zur Optimierung entfernt.
Aus Ihrem Beispiel:
%Vor% Nun fügen Sie versehentlich eine ähnliche Methode in A
hinzu, die zu einem Fehler führt:
Also die Signaturen zwischen neuen A::showPath()
& amp; bestehende B::showPath()
müssen verhandelt werden & amp; Fahren Sie dann fort, indem Sie final
specifier entfernen.
Nein, gibt es nicht.
Das Hinzufügen einer virtuellen Funktion zu einer Basisklasse mit der gleichen Signatur wie eine virtuelle Funktion in einer untergeordneten Klasse kann keine vorhandene Funktionalität nicht brechen, es sei denn, Sie fügen diese virtuelle hinzu Funktion wandelt die Basisklasse in einen polymorphen Typ um . Also in der Norm, es ist gutartig, und eine reinste würde argumentieren, Hinzufügen von Sprach-Features, um dagegen zu schützen wäre ziemlich sinnlos.
(Natürlich könnten Sie Ihre neue Funktion final
nur markieren, um zu überprüfen, ob eine untergeordnete Klassenfunktion sie nicht überlisten wird.)
Ihre einzige Option besteht darin, Code-Analyse-Tools zu verwenden.
(Beachten Sie, dass VS2012 den C ++ 11-Standard nicht implementiert oder sogar behauptet, ihn zu implementieren, obwohl er einiges davon enthält.)
Tags und Links c++ c++11 inheritance class-hierarchy modifiers