Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++

Dynamiccast

Testen Sie unsere 2017 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Um einen Pointer auf einer dynamischen Klasse richtig verwenden zu können, benötigen Sie den sogenannten "dynamic_cast". Der Trainer zeigt Ihnen die richtige Verwendung und gibt Ihnen Hinweise, wo solche Typen eingesetzt werden.

Transkript

Die klassischen Typecasts haben wir ja schon öfters verwendet, aber im Zusammenhan mit Klassen gibt es noch einen interessanten Cast, den Dynamiccast, das ist eigentlich von C++ verwendete System, neben dem Staticcast und Constcast und ich zeige Ihnen mal wie das funktioniert. Also wir haben hier wieder eine Klasse CFahrzeug, ganz normal, das ist alles soweit gut und eine virtuelle Ausgabebmethode und ich habe hier eine Klasse Auto auch vom Typ Fahrzeug abgeleitet, wie wird das schon hatten mit public, das ist alles ganz normal, mit der Ausgaberoutine überschrieben, ich habe aber hier noch eine neue Ausgabe, die nicht virtuell ist, die jetzt dazugekommen ist. Und jetzt im Hauptprogramm machen wir wie gehabt erst einaml ein Objekt c2. Kein Problem, das kan ich auch direkt ausgeben, soweit OK. Wenn ich jetzt ein Basispointer erzeuge, also ein CFahrzeug * pgnereic, dann habe ich da ein Problem. Wenn ich jetzt diese Zuweisung hier mache, nämlich hier habe ich nur noch einen Pointer auf die Basisklasse, bei virtuellen Methoden ist es ja kein Problem, wenn ich hier ausgabe mache, rufe ich die virtuelle Methode auf, also automatisch diese Ausgaberoutine von meinem CAuto. Aber von hier aus komme ich nicht an die neue Ausgabe heran. Nun könnte man das im Prinzip ganz leicht lösen, das haben wir ja eigentlich schonmal gemacht. Indem ich hier ein Cast mache, Jetzt mal nach der klassischen Methode und schreibe jetzt hier den Pointer dazu, so, und danach habe ich ja jetzt wieder ein Autopbjekt, mal schauen, und kann jetzt hier auch, da unten haben wir es auch auf neueausgabe zugreifen, das ist eigentlich geht aber gefahr. Die Gefahr besteht darin, wenn ich jetzt hier nicht ein Auto drin habe,sondern ein Schiff zum Beispiel, dann würde ich hier ein Problem kriegen, dann stürzt mir das Programm natürlich ab, weil zur Übersetzungszeit ist nicht bekannt, was da drin sein wird und zur Laufzeit wird da nichts geprüft. Ich starte mal das Ganze. Wir werden gleich sehen, hier wird nämlich dreimal auto:kennzeichen aufgerufe. das ist genau diese neueausgabe, die wir hier haben auto:kennzeichen. Die andere Methode, die etwas besser ist, ist nämlich ein Dynamiccast zu verwenden, hier ein Pointer auf Auto und mit dynami_cast kann ich das casten. Der große Unterschied ist, dass ich hier eine Null bekomme, wenn es ein nicht-cast-fähiges Objekt ist. Das ist eine Geschichte, die ist entscheidend, weil dann brauche ich nur abprüfen, kann dann natürlich mit dem Pointer direkt ausgeben, sowas könnte ich auch machen, da muss man aber schon aufpassen was passiert, wenn der Wert NULL ist, ist unter umständen nicht definiert, aber instrgesamt, ist dieser Block jetzt sauber, also dynami_cast, deshalb dynamic, weil es nämlich zur Laufzeit erst gesucht wird sozusagen ob ich das überhaupt casten kann und das Laufzeitsystem mir dann halt ein NULL bringt, wenn es nicht funktioniert. Ich kann ja jetzt mal auf die Schnelle, wir machen mal einfach eine Kopie von der ganzen Geschichte und hier schreiben wir jetzt CAuto 2 hin. Som das ist jetzt einfach mal nur, damit ich hier unten einen ganz fiesen Trick mache. Ich weise nämlich jetzt dem ein Auto2 zu und wir starten das Ganze mal und schauen was passiert, ich kann übrigens auch hier unten mchen, da dürfte gar nicht passieren, da haben wir Glück, wenn da nichts passiert, es würde sonst normalerweise böse crashen. Na ja er kommt aber hier schon drauf, dass da ein Fehler besteht: Auto : Nur die Konstruktor da haben wir allerding ein anderes Fehlerchen hier noch drin gehabt, vor lauter schnell-mal-machen. So jetzt tue ich das noch übersetzten, da muss natürlich genau so heißen, das machen wir eine Kopieraktion, ich liebe es mal so Programmteile zu kopieren, aber das ist immer wieder voller, da haben wir bestimmt noch was faules drin, na ja, das ist klar, das muss ich natürlich auch entsprechend schreiben, weil hier darf ich ja nichts irgendwo hincasten, was da nicht funktioniert, schauen wir mal ob ich jetzt alles gefunden habe hier vor lauter Jetzt sieht es aber ganz gut aus und da sehen Sie schon, das wir hier unten nur einmal ausgegeben, auto:kennzeichen, das ist diese fiese Falle die ich hier oben eingebaut habe, die ich eigentlich gar nicht hier stehen lassen möchte, kann man hier mal auch ausklammern das Ganze, weil das ist ganz ganz dumm, das sollte man nicht tun, aber wenn ich jetzt hier starte ohne Debug mache, dann werden Sie sehen, da kommt jetzt auch das Kennzeichen hier unten nicht raus, weil hier bekomme ich jetzt eine NULL, das ist ganz klar,weil ich habe ja kein CAuto2 dadrin, sondern ein CAuto und aus dieem Grunde, kann ich zur Laufzeit das nicht entsprechend zuweisen.

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!