Static methods do not participate in
polymorphism therefore they are hidden not overridden.
This is one place where C# has
Java beat. In C# you can't run static methods (which are class methods) with an object reference.
Think about how we normally execute static methods. We don't do:
H h = new H();
h.m();
we do:
H.m();
Try this: the method that gets executed is determined at compile time for static methods. So when you do something like:
H h = new G();
h.m();
Since h is a pointer to an H object, it is the static method of the H class that will be executed, not the static method of the G class. That is because at compile time the compiler has no idea that h is pointing to a G object.
Static methods don't participate in polymorphism therefore they can't be overridden. They can only be hidden.