Overriding vs Method Hiding
Overriding replaces or specializes a virtual method implementation and participates in runtime polymorphism. Method hiding, or shadowing, defines a separate member with the same or related name in the derived class; the member selected can depend on the compile-time type of the reference. This distinction is important because hiding can produce surprising behavior when an object is accessed through a base-type reference. As a senior engineer, I prefer explicit overriding for polymorphic behavior and use hiding only when the semantics are intentional.
Overriding is runtime polymorphism.
The actual object's implementation is selected for an overridden virtual method.
Hiding creates a distinct member in the derived class.
With hiding, the compile-time/reference type can affect which method is selected.
Hiding can make APIs confusing, so it should be explicit and intentional.
The exact mechanics differ between Java and C#.