Если ваша переменная имеет тип Base
, она может быть теоретически построена конструктором Derived
, таким образом, фактически являясь переменной типа Derived
.Во время компиляции компилятор не заботится о том, чтобы выяснить, возможна ли в каждом конкретном случае такая потеря (представляющая переменную типа Base
как сущность типа Derived
).
Ваш образец прост - вы создаете новый класс и сразу его разыгрываете.Но что, если вы получите Base
откуда-то еще, например, вызов некоторого метода?Компилятор просто не может «угадать», что должен вернуть ваш метод, и поэтому выбрасывает, а не выбрасывает ошибку.
Когда вы приводите Other
, компилятор видит, что нет никакой возможности, что Other
на самом деле Derived
и выдает исключение.