virtual und static_cast
-
#include <iostream> using namespace std; class Base { private: int range; public: Base::Base(): range(1) {} virtual int get_range() { return range; } }; class Child: public Base { private: int range; public: Child::Child(): range(2) {} int get_range() { return range; } }; int main() { Child *ptrChild = new Child; Base *ptrBase = static_cast<Base*>(ptrChild); cout << ptrBase->get_range() << endl; delete ptrChild; cin.get(); }
hi!
mach nen kleinen test zu virtual..Child *ptrChild = new Child;
// der Pointer *ptrChild des Typs Child zeigt auf den reservierten speicher für Child, kann man dann von einem Objekt reden?Base *ptrBase = static_cast<Base*>(ptrChild);
// da caste ich einfach den Pointer auf den Typ Base!?cout << ptrBase->get_range() << endl;
// da ruf ich fank virtual die get_range() der Klasse Child auf!? da wir ja speicher des types Child haben, egal welcher typ der pointer ist..hab ich das so richtig verstanden??
cu
-
Man castet zwischen Zeigern mit dem reinterpret_cast.
-
Brutus schrieb:
Man castet zwischen Zeigern mit dem reinterpret_cast.
WTF??
-
Casten schrieb:
hi!
mach nen kleinen test zu virtual..Child *ptrChild = new Child;
// der Pointer *ptrChild des Typs Child zeigt auf den reservierten speicher für Child, kann man dann von einem Objekt reden?Base *ptrBase = static_cast<Base*>(ptrChild);
// da caste ich einfach den Pointer auf den Typ Base!?die konvertierung eines pointers auf child in einen pointer auf base ist stets implizit möglich (ausser im falle multipler vererbung, wenn die basisklsse mehrfach (und nicht virtuell) vererbt wurde). das static_cast ist also überflüssig.
cout << ptrBase->get_range() << endl;
// da ruf ich fank virtual die get_range() der Klasse Child auf!? da wir ja speicher des types Child haben, egal welcher typ der pointer ist..hab ich das so richtig verstanden??
cu
korrekt, wenn du in der basisklasse einen virtuellen destruktor definierst (das solltest du immer tun, wenn du mit virtuellen funktionen arbeitest), kannst du auch den basisklassenpointer für das delete benutzen.
-
hi!
mach nen kleinen test zu virtual..Child *ptrChild = new Child;
// der Pointer *ptrChild des Typs Child zeigt auf den reservierten speicher für Child, kann man dann von einem Objekt reden?Base *ptrBase = static_cast<Base*>(ptrChild);
// da caste ich einfach den Pointer auf den Typ Base!?die konvertierung eines pointers auf child in einen pointer auf base ist stets implizit möglich (ausser im falle multipler vererbung, wenn die basisklsse mehrfach (und nicht virtuell) vererbt wurde). das static_cast ist also überflüssig.
wann is sowas dann nicht überflüssig!?? sowohl upcast als auch downcast...
cu
-
beim downcast ist es nötig.
cu
-
Brutus schrieb:
Man castet zwischen Zeigern mit dem reinterpret_cast.
Genau, wozu überlegen welchen man benutzen soll, wenn reinterpret_cast doch immer funktioniert
.
-
hi. schrieb:
beim downcast ist es nötig.
cu
beim downcast hast du prinzipiell die auswahl zwischen static_cast und dynamic_cast, letzteres ist langsamer aber sicher; bei static_cast must du selbst sicherstellen, dass das objekt tatsächlich ein objekt der zielklasse (oder einer davon abgeleiteten klasse) ist, bei dynamic_cast wird das zur laufzeit sichergestellt (liefert 0 wenn die umwandlung scheitert, bzw. wirft std::bad_cast bei referenzen).
-
camper schrieb:
hi. schrieb:
beim downcast ist es nötig.
cu
beim downcast hast du prinzipiell die auswahl zwischen static_cast und dynamic_cast, letzteres ist langsamer aber sicher; bei static_cast must du selbst sicherstellen, dass das objekt tatsächlich ein objekt der zielklasse (oder einer davon abgeleiteten klasse) ist, bei dynamic_cast wird das zur laufzeit sichergestellt (liefert 0 wenn die umwandlung scheitert, bzw. wirft std::bad_cast bei referenzen).
Hi! ich meinte wann is sowas bei meinem beispiel da nötig, up und downcast? cu
-
Caster schrieb:
Hi! ich meinte wann is sowas bei meinem beispiel da nötig, up und downcast? cu
du machst ja nur einen upcast, und der ist implizit. probiers doch aus.