pero esta sentencia no deberia funcionar?
Lo voy a explicar que seguro que así todos nos aclaramos.
Java tiene dos "tipos" de clases: estáticas y dinámicas. Las clases estáticas son las que se ponen al declarar el objeto, y que son las que mirara el COMPILADOR de Java. Las dinámicas son las que pones al crear el objeto(que es distinto que declararlo), y que son las que funcionarán al ejecutar el programa.
Pasa que por ejemplo, la clase C, que deriva de A, puede hacerse así:
De hecho es correcto hacerlo, y se usa mucho a la hora de si quisieses por ejemplo hacer un Array con objetos de clase A, pero siendo más específico meter un objeto de clase C.
Hasta ahí bien, pero con el cast lo que haces es decirle al COMPILADOR: tú tranquilo, que aunque su clase estática sea la que sea, este objeto es de esta clase(vamos, tienes que estar seguro que su clase dinámica va a ser siempre la que indicas al castear, porque si no te puede dar errores de ejecución, o que el programa no funcione como esperabas).
Con lo cual, lo que estas haciendo es decirle al compilador que tu clase es A, algo que ya sabía por que su clase estática era esa. Pasa que a la hora de ejecutarlo, como su clase dinámica es otra, va a empezar a "buscar el método por abajo", y se va a encontrar primero el de la C en el caso de que sue clase dinámica sea esta.
Con lo cual simplemente podrías llamar al método de la clase A con un objeto de tipo estático A o B, ya que el C siempre te lo va a sobreescribir, por mucho que castees. Hay que darse cuenta que el casteo solo sirve para que el compilador no te tire errores, y hay que tener mucho cuidado con él porque puede romperte un programa.
Espero haberme explicado bien, un saludo!