C++

Virtuelle Methoden

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Erzeugen Sie mit dem Trainer virtuelle Methoden und lernen Sie, welche Möglichkeiten Ihnen damit zur Verfügung stehen.

Transkript

Kommen wir jetzt zu einem wichtigen Element den virtuellen Destructor und ich zeige ihnen gleich was es damit auf sich hat. Also hier haben wir eine ganz einfache Basisklasse Cbasis gennant und damit wir ein bisschen was sehen von Constructor und Destructor, geben wir hier einfach mal mit cout den Wert, beziehungsweise den Text basis constructor oder basis destruktor aus. Das andere interessiert uns hier in diesen Fall nicht so sehr. Dann leiten wir davon eine Klasse CAbleit ab, also CAbleit von Cbasis, die hat jetzt hier ein dynamischen Pointer, denn ich hier alloziere mit ptr= new char von einem string, kopiere den Wert dann dahin und hier schreiben wir hin ableitet, der abgeleitete Constructor wird praktische hier aufgerufen und anschließend brauche ich natürlich auch einen Destructor, um den Speicher wieder freizugeben. Mit delete ptr lösche ich einfach den Pointer wieder. Also ableit destructor wird dann hier aufgerufen. Und die Ausgabe kann man gleich noch machen, das ist kein Problem, die geben wir natürlich auch noch aus. Ja, und was mache ich jetzt? Jetzt machen wir das Ganze natürlich etwas tricky. Wir nehmen hier ein Pointer basis. Also wenn ich jetzt hier natürlich einen Pointer auf CAbleit lege, dann wäre das alles kein Problem, aber der basis Pointer ist jetzt das Interessante der ist hier und der wird jetzt hier mit einem Cast (Cbasis *) new CAbleit ("Hallo Welt") auch initialisiert, nämlich mit unserer abgeleiteten Klasse. Das basis Ding weiß jetzt eigentlcih nicht mehr wirklich was davon. Die Ausgabe ist die jetzt virtual, die ist im dem Fall virtual. Das ist OK. Die wird dann natürlich richtig aufgerufen. Da passiert nichts. Jetzt fragt sich aber: Was passiert aber, wenn ich jetzt hier ein delete mache, also den Speichen wieder freigebe? Und Sie ahnen natürlich schon warum ich dieses Beispiel genommen habe. Ich starte das mal jetzt hier, dann sieht es natürlich so aus. Der basis constructor wird aufgerufen, dann wird der ableit constructor aufgerufen, unser Text wird entsprechend ausgegeben. Und was passiert jetzt? Der basis destructor wird aufgerufen. Aber was fehlt? Der ableit construktor. Das ist eigentlich ganz klar. Das ist ähnlich wie bei der Ausgabe. Das delete ruft ja auch nur die einzelnen Methoden auf und findet aber nur den der basis Klasse. Sie weiß ja gar nichts, dass das Ganze eigentlich nur ein Objekt ist mit von der abgeleiteten Klasse, weil wir ja hier den Pointer entsprechend auch gecastet haben. Und damit es funktioniert, das ist eigentlcih ganz simpel, machen wir hier ein virtual~ Cbasis hin, damit wird die delete-Methode nachher auf die viruelle Methode Cbasis zugreifen können und dann sollte das Ganze auch richtig funktionieren. In der Tat wird hier dann auch noch der basis Destruictor noch zusätlich aufgerufen. Das ist interessant, weil es ist nich wie ein Methoden-Aufruf, wo ich jetzt hier einfach die Methode aufrufe wie ausgabe, wo ja nur ausgabe aufgerufen wird, aber die alte ausgabe hier nicht. Das macht das System dann automatisch, also das ist auch nochmal wichtig zu wissen. Und jetzt probieren wir das Ganze erstmal aus. Ich starte es mal. Jetzt sehen wir schon: Basis constructor aufgerufen, ableit constructor aufgerufen, das geschieht immer von innen nach außen, nur so macht das auch Sinn. Dann Hallo Welt ausgegeben, dann der ableit destructor, also das Ganze wieder zurück in der umgekehrten Reihenfolge aufgerufen und am schluss auch noch der basis destructor. Da hätten wir jetzt auch irgeneinen Speicher freigeben können, wenn man das im Basiselement auch verwendet hätten. Und so ist das Ganze sauber. Also hier braucht man dann virtuelle Destruktoren, damit man das sauber machen kann. Virtuelle Konstruktoren sind nicht erlabt, die gibt es nicht, die machen da auch keinen Sinn, weil ich hier auch nacheinander das Ganze ja entdprechend richtig aufrufe. Der Konstruktor wird hier auch immer brav richtigherum aufgerufen, ist ja auch kein Wunder, denn hier mache ich ja ein new CAbleit, also die richtige Klasse wird hier an dieser Stelle schon aufgerufen und die weiß ja auch, welche Konstruktoren gebraucht werden zum Aufbau. Erst hier ist es ja sozusagen asymmetrisch. Wenn ich hier ein Cast gemacht hätte, dann würde es auch ohne diesen virtuellen Destruktor funktioniert haben. Das können Sie ja auch gerne mal ausprobieren, aber so ist es eigentlich die Standardmethode, so muss man das hier in diesem Fall machen.

C++

Machen Sie sich mit den einfachen Grundlagen zu C++ vertraut und lernen Sie anhand zahlreicher Übungs- und Codebeispiele die Klassenkonzepte, Prozeduren und Funktionen kennen.

9 Std. 3 min (143 Videos)
Derzeit sind keine Feedbacks vorhanden...

Video-Training auf DVD mit Bonusmagazin

+ Tutorial to go: Mit Videos für iPod, iPhone & Co.

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!