Explizite Typumwandlung von Basisklassen nach abgeleiteten Klassen heißen Downcasts. Sie sind erlaubt, aber gefährlich:
class mensch { char *name; public: mensch(); mensch(char *n); char *getname(); }; class student : public mensch { char *ort; public: student(); student(char* n, char *o); char *getort(); }; int main() { student s("Meier","Paderborn"); mensch* mp = &s; // Ein Downcast: cout << ((student*)mp)->getort(); }
Kommt nun eine zweite abgeleitete Klasse hinzu, kann es gefährlich werden:
class wirt : public mensch { int umsatz; char *ort; public: wirt(); wirt(char* n, char *o); char *getort(); }; int main() { wirt w("Meier","Paderborn"); mensch* mp = &w; cout << ((student*)mp)->getort(); }
liefert:
Segmentation fault (core dumped)
Eine Möglichkeit Downcasts sicherer zu machen:
class wirt; // forward class student; // forward class mensch { .... virtual student* cast2student() { return 0;} virtual wirt* cast2wirt() { return 0;} }; class student : public mensch { .... student* cast2student() { return this;} }; class wirt : public mensch { .... wirt* cast2wirt() { return this;} }; int main() { wirt w("Meier","Paderborn"); mensch* mp = &w; if (mp->cast2student()) cout << mp->cast2student()->getort(); else cout << mp->cast2wirt()->getort(); }