C++ Tutorial

Typkonvertierungen und Klassenzeiger

static_cast Operator

Wie zuvor erwähnt (Typkonvertierungen), kann mittels des static_cast-Operators unter anderem ein void-Zeiger in einen anderen Zeigertyp konvertiert werden.

Mithilfe des static_cast-Operators kann aber auch ein Basisklassenzeiger in einen Zeiger auf einer davon abgeleiteten Klasse konvertiert werden. Dies wird als downcasting bezeichnet. Wird versucht mittels static_cast einen Basisklassenzeiger auf eine nicht von der Basisklasse abgeleitete Klasse zu konvertieren, führt dies beim Übersetzen des Programms zu einem Fehler.

Außer zur Konvertierung von Zeigern kann static_cast ebenfalls zum Konvertieren von Referenzen eingesetzt werden.

1: // Basisklasse
2: class Base
3: {...} *pBase;
4: // Abgeleitete Klasse
5: class Der: public Base
6: {...} derObj;
7: // Beliebige weiter Klasse
8: class CAny
9: {...};
10: ...
11: // Basis-Referenz auf abgeleitetes Objekt
12: Base& baseRef = derObj;
13: // Zeiger auf abgeleitete Klasse
14: Der *pDer = static_cast<Der*>(pBase);
15: // Aber das geht nicht!
16: CAny *pAny = static_cast<CAny*>(pBase);
17: // Auch mit Referenzen
18: Der& refDer = static_cast<Der&>(baseRef);

dynamic_cast Operator

Der dynamic_cast Operator dient ausschließlich zum Konvertieren von Zeigern und Referenz zwischen abgeleiteten Klassen. Er wird hauptsächlich eingesetzt, wenn ein Basisklassenzeiger auf einen Zeiger einer abgeleiteten Klasse konvertiert werden soll (downcasting). Diese Konvertierung lässt sich auch mittels des static_cast-Operators durchführen, aber der dynamic_cast Operator bietet eine zusätzliche Funktionalität: Er überprüft zur Laufzeit, ob im Basisklassenzeiger ein Verweis auf die entsprechende Klasse enthalten ist.

1: // Klassendefinitionen
2: class Win
3: {...};
4: class FrameWin: public Win
5: {...};
6: // Definitionen
7: Win *pWin1 = new FrameWin;
8: Win *pWin2 = new Win;
9: FrameWin *pFrame;
10: // Konvertierungen ok
11: pFrame = dynamic_cast<FrameWin*>(pWin1);
12: // Konvertierung schlägt fehl, Ergebnis ist nullptr!
13: pFrame = dynamic_cast<FrameWin*>(pWin2);

Die erste Konvertierung konvertiert den Basisklassenzeiger pWin1 in einen FrameWin-Zeiger. Da pWin1 auf ein Objekt vom Typ FrameWin verweist, liefert diese Konvertierung keinen Fehler zurück. Die zweite Konvertierung hingegen schlägt fehl. Hier wird der Basisklassenzeiger pWin2 in einen FrameWin-Zeiger konvertiert. Da in pWin2 ein Verweis auf ein Win-Objekt abgelegt ist, liefert der dynamic_cast Operator hier als Ergebnis einen nullptr zurück. D.h., der dynamic_cast Operator überprüft zur Laufzeit, ob die Konvertierung des Basisklassenzeigers typsicher durchgeführt werden kann.

Wird anstelle eines Zeigers eine Referenz mittels dynamic_cast konvertiert und die Konvertierung ist nicht zulässig, löst der dynamic_cast Operator eine Ausnahme vom Typ bad_cast aus.


Copyright 2024 © Wolfgang Schröder
E-Mail mit Fragen oder Kommentaren zu dieser Website an: info@cpp-tutor.de
Impressum & Datenschutz