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();
}