c ++ virtuelles Schlüsselwort und überschreibende Funktion

8

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%     
Sarah Sepanski 27.07.2017, 17:45
quelle

4 Antworten

11

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.

%Vor%

Die Ausgabe ist

%Vor%     
CoryKramer 27.07.2017, 17:49
quelle
6

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.

    
Curious 27.07.2017 17:49
quelle
2

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:

%Vor%

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.

    
tadman 27.07.2017 17:48
quelle
2

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.

Marek R 27.07.2017 18:01
quelle

Tags und Links