Ich lerne c ++ und lerne über das virtuelle Keyword. Ich habe das Internet durchforstet, um es vergeblich zu verstehen. Ich ging zu meinem Editor und führte das folgende Experiment durch und erwartete, dass es die Basisnachricht zweimal ausdrucken würde (weil ich den Eindruck hatte, dass das virtuelle Schlüsselwort benötigt wird, um Funktionen außer Kraft zu setzen). Es wurden jedoch zwei verschiedene Nachrichten ausgedruckt. Kann mir jemand erklären, warum wir das virtuelle Schlüsselwort brauchen, wenn wir Funktionen einfach überschreiben können und trotzdem scheinbar polymorphes Verhalten bekommen? Vielleicht kann mir jemand und andere Menschen in der Zukunft virtuell vs. überschreiben helfen. (Die Ausgabe, die ich bekomme, ist "Ich bin die Basis", gefolgt von "Ich bin abgeleitet").
%Vor% Betrachten Sie das folgende Beispiel. Die wichtige Zeile zur Veranschaulichung der Notwendigkeit von virtual
und override
ist c->printMe();
. Beachten Sie, dass der Typ von c
Base*
ist, jedoch aufgrund von Polymorphie die überschriebene Methode korrekt von der abgeleiteten Klasse aufrufen kann.
Die Ausgabe ist
%Vor%Mit dem Code, den Sie haben, wenn Sie dies tun
%Vor% Was denkst du passiert? Es wird I am the derived
nicht ausgedruckt, da die Methode nicht virtuell ist und der Versand außerhalb des statischen Typs des aufrufenden Objekts erfolgt (d. H.% Co_de%). Wenn Sie es in virtual ändern, hängt die aufgerufene Methode vom dynamischen Typ des Objekts und nicht vom statischen Typ ab.
Sie sehen das Verhalten hier nicht, weil Sie b
vom Typ Derived
deklariert haben, damit der Compiler weiß, welche Funktionen zu verwenden sind. Um zu entlarven, warum virtual
notwendig ist, müssen Sie Dinge vermischen:
Nun ist b
vom Typ Base*
, was bedeutet, dass es die Funktionen von Base
plus benutzt, egal was in der virtuellen Funktionstabelle ist. Dies unterbricht Ihre Implementierung. Sie können es beheben, indem Sie die Dinge virtual
richtig deklarieren.
override
ist ein neues Schlüsselwort, das in C ++ 11 hinzugefügt wurde.
Sie sollten es verwenden, weil:
Der Compiler überprüft, ob eine Basisklasse eine passende virtual
-Methode enthält. Dies ist wichtig, da ein Tippfehler im Methodennamen oder in seiner Liste von Argumenten (Überladungen sind erlaubt) dazu führen können, dass etwas außer Kraft gesetzt wurde, obwohl dies nicht der Fall war.
Wenn Sie override
für eine Methode verwenden, meldet der Compiler einen Fehler, wenn eine andere Methode überschrieben wird, ohne das Schlüsselwort override
zu verwenden. Dies hilft bei der Erkennung von unerwünschten Übersteuerungen, wenn Symbolkollisionen auftreten.
virtual
bedeutet nicht "überschreiben". In Klasse doent verwenden "override" Schlüsselwort, als eine Methode überschreiben, können Sie einfach diese Methode schreiben "virtuelle" Schlüsselwort weglassen, wird Override implizit passieren. Entwickler haben virtual
vor C ++ 11 geschrieben, um ihre Überschreibungsabsicht anzuzeigen. Einfach ausgedrückt virtual
bedeutet: Diese Methode kann in einer Unterklasse überschrieben werden.
Tags und Links c++ virtual override polymorphism