um das so zu machen, müsste ich aber mehrere dinge wissen, oder nicht? zum einen müsste mir doch der typ der klasse bekannt sein und zum anderen müsste ich wissen, wo der zeiger im speicher hindeutet. oder seh ich das falsch?
Genau! Du kannst nicht sicher sagen, ob der cast zulässig ist.
Ist er nicht zulässig bekommst du durch einen unerlaubten downcast Zugriff auf einen Speicherbereich, der geschützt ist. Im besten Fall stürzt dein Programm mit einem segmentation fault sofort ab, im schlechtesten Fall bleibt der Fehler wenn er passiert unentdeckt. Dein Programm stürzt dann an einer ganz anderen Stelle im Code völlig unvorhersehbar und schlecht reproduzierbar ab.
Arbeitet man in C++ (zum Beispiel) mit einem Basisklassenzeiger, der immer nur auf das jeweilige spezialisierte Objekt gecastet wird, gibt es deswegen den dynamic_cast-Operator, welcher zur Laufzeit überprüft, ob der downcast zulässig ist. Trotzdem sollte man den dynamic cast (oder noch schlimmer: den cross cast) möglichst vermeiden. Wird sowas häufig gebraucht, dann stimmt irgendwas mit dem Software design nicht.
Stell dir dieses gecaste wie eine Schablone vor, die du auf das Objekt legst. Bei einem upcast (von einer abgeleiteten Klasse auf die Basisklasse) wird mit der Basisklassen-Schablone einfach die Basisfunktionalität aus dem Objekt ausgeschnitten - es ist immer zulässig und es passiert nichts. Deswegen kann es der Compiler auch sofort.
Beim downcast legst du eine spezialisierte und damit erweiterte Schablone auf ein Objekt. Dies funktioniert nur, wenn das Objekt diese spezialisierte Funktionalität auch wirklich besitzt. Ansonsten, naja, siehe oben
PS.: mein Senior-Ingenieur springt bei dem Thema downcast sofort im Dreieck