Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C++ Grundkurs

Virtuelle Methoden

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
C++ löst virtuelle Methoden erst zur Laufzeit aus. Diese stellen in der Programmiersprache die Grundlage für die Polymorphie dar.
04:20

Transkript

In dieser Lektion will ich Ihnen "virtuelle Methoden" in "C++" vorstellen. Wird eine virtuelle Methode beim "Basisklassenzeiger" oder eine Referenz auf ein Objekt einer abgeleiteten Klasse aufgerufen, wird die Methode der abgeleiteten Klasse ausgeführt. Was heißt das konkret? Hier habe ich einen "BankAccount". Das ist eine abgeleitete Klasse. Abgeleitet ist der "BankAccount" von "Account". Wenn ich jetzt einen "aPtr" also Pointer auf den Account mit einem Zeiger auf den BankAccount initialisiere, und ich rufe "aPtr" auf, wird zur Laufzeit "aPtr" auf den Typ "bankAccount" ausgeführt. Das Gleiche trifft für Referenzen zu. Wenn ich eine Referenz "aRef" erzeuge und sie an einen "bankAccount" binde, bewirkt "aRef.withdraw", dass die Methode auf meinen "bankAccount" ausgeführt wird. Diese Eigenschaft nennt sich "Polymorphie". Das heißt, die Entscheidung, welches Objekt verwendet wird, wird erst zur Laufzeit getroffen. Zur Laufzeit ist erst klar, auf was "aPtr" oder "aRef" zeigen. Da das erst zur Laufzeit geschieht, nennt sich das Ganze auch dynamische oder späte Bindung. Da will ich Ihnen gerne noch ein paar Regeln nennen dazu. "Konstruktoren" sind die Ausnahme. "Konstruktoren" können im Gegensatz zu "Destruktoren" nicht virtuell sein. Natürlich können alle anderen Methoden auch virtuell sein. Virtuelle Methoden müssen in abgeleiteten Klassen nicht überschrieben werden. Ist eine Methode mal virtual deklariert in der Basisklasse, bleibt sie die ganze Ableitungskette hindurch virtuell. Wichtig ist, dass eine virtuelle Methode in der "abgeleiteten Klasse" die gleichen Parameter besitzt wie in der "Basisklasse". Anders ausgedrückt, dass die Signatur der Methode identisch bleibt. Wird eine Methode hingegen nicht mit dem Schlüsselwort virtual ausgezeichnet, findet auch keine späte Bindung statt. Das heißt, nicht das Objekt der abgeleiteten Klasse, die auf den Zeiger verweist oder die Referenz verweist, sondern die Methode des Objekts wird selbst ausgeführt. Eine virtuelle Methode, die in der Basisklasse "private" deklariert wurde, kann in der abgeleiteten Klasse überschrieben werden. Das wundert die meisten Entwickler, wenn sie das das erste Mal sehen. Tatsächlich ist es möglich. Sie können eine virtuelle Methode, die privat ist, deklariert haben, und sie trotzdem in einer abgeleiteten Klasse überschreiben. Jetzt noch eine feine Unterscheidung. Sie müssen zwischen "Überschreiben" und "Überladen" unterscheiden. Was ich gerade vorgestellt habe, war "Überschreiben*. Eine Funktion ist überladen, wenn Sie eine Funktion mehrfach definieren, sodass sie mit verschiedenen Parametertypen aufgerufen werden kann. Das war jetzt viel Theorie. Jetzt will ich es in der Praxis zeigen. Ich habe hier eine Klasse "Base" und eine Klasse "Derived". "Derived" ist von "Base" abgeleitet. Jetzt habe ich zwei Methoden definiert in jeder Klasse. Die beiden Methoden sind identisch. Dier erste Methode heißt "getNameVirtual". Die ist als virtuell deklariert und die gibt einen Namen aus "Base::getNameVirtual". Dann gibt es noch einen Methode "getName". Die ist nicht virtuell. Das ist der große Unterschied. Die ganz gleichen Methoden habe ich noch beim "Derived" definiert. Das "virtual" hier ist überflüssig. Macht aber durchaus Sinn das hinzuschreiben, weil es einfach dokumentiert, diese Methode hier ist virtuell. Den feinen Unterschied, den sieht man schön, wenn ich jetzt das Programm ausführe. Ich habe ein Objekt vom Typ "Derived". Binde es mit einem Zeiger an einen "basePtr". Wenn ich jetzt "basePtr-getNameVirtual()" aufrufe, und "basePtr-getName()" aufrufe, wobei die erste Methode virtuell ist, die nicht virtuell ist, sieht man hier den feinen Unterschied. "basePtr-getNameVirtual()" wird tatsächlich auf die abgeleitete Klasse "Derived" abgebildet. Es findet also eine späte Bindung statt. Das trifft nicht ein, wenn ich eine Methode verwende, die nicht virtuell ist. Da wird die Methode der Basisklasse aufgerufen. Das Gleiche gilt natürlich auch für die weitere Art von "Indirektion" für eine Referenz. Wenn ich "baseRef.getNameVirtual()" aufrufe, wird "Derived getNameVirtual" prozessiert. Wenn ich "baseRef.getName()" aufrufe, wird "Base getName" prozessiert. In dieser Lektion habe ich Ihnen "virtuelle "Methoden in "C++" vorgestellt. Rund um virtuelle Methoden gibt es ein paar Regeln im Kopf zu behalten. Die entscheidende Regel ist aber, dass eine Methode nur virtuell ist, wenn sie virtuell deklariert wird.

C++ Grundkurs

Steigen Sie in die mächtige Programmiersprache C++ ein und lernen Sie dabei alle wichtigen Funktionen mit Anwendungsbeispielen kennen.

8 Std. 14 min (147 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!