Reference Conversions
Conceptually, we saw, an instance of a subclass “is an” instance of the superclass.
Hence one can assign a reference to a subclass object to a variable of a superclass type.
Concretely, this implies a conversion from a subclass type to a superclass type should be treated as a widening conversion. Recall widening conversions are allowed implicitly in various contexts.
Narrowing conversions go the other way—from a superclass down to some subclass. Narrowing conversions require an explicit cast.
They are best avoided where possible, but sometimes they are inevitable.