Die Frage, die du dir hier stellen solltest, ist nicht, wie du diesen Cast irgendwie hinbekommst. Die Frage sollte sein, wieso in Gottes Namen du casten musst. Der Cast ist nur ein Symptom eines viel fundamentaleren Problems. In dem Moment, wo du einen Pointer auf eine Basisklasse in einen Pointer auf eine abgeleitete Klasse casten willst (egal auf welche Art), zeigt sich ein prinzipieller Widerspruch im Design der Software. Denn überleg mal, was das bedeutet: Du hast hier ein Stück Code, das mit einem generischen Interface zu arbeiten versucht, welches sich zur Lösung der Aufgabe aber als nicht geeignet erweist. Das bedeutet, dass entweder das Interface nicht zu deiner Problemstellung passt oder der Code das falsche Interface verwendet: Die Struktur der postulierten Lösung passt nicht zur Struktur des Problems. Um das Problem zu lösen, wirst du entweder dem Stück Code, in dem das Problem auftritt, das passende Interface übergeben oder deine Abstraktion (deine Interfaces) überdenken müssen. Wenn du auf dieses Problem stoßt, dann ist das die Chance, etwas über das Problem zu lernen, das du vorher nicht wusstest, denn sonst würde das Problem nicht auftreten. Symptombehandlung ist maximal eine temporäre Lösung; Refactoring ist eine gute Sache. Stell die richtige Frage und du dein Design wird besser als du je gedacht hättest...