First, Deer() is not a default constructor. It is a no-argument constructor but since you specify it explicitly, it is not "default".
Second, even though the variable is declared as Deer, the actual instance is a Reindeer. Since hasHorns is an instance method, then polymorphic behavior is exhibited and the actual type's method is invoked.
Practice only makes habit, only perfect practice makes perfect.—every music teacher ever
Practice mindfully by doing the right things and doing things right.— Junilu