If a method is not virtual (or abstract), it can’t be overriden in the sub class. The only option then is to use the
new keyword to hide the inherited method, but this is generally not a recommended practice, since casting the instance of the sub class to the parent class and calling the method will cause the parent class method to be called instead, and that is probably not the intended functionality.
So in short, yes it needs to be virtual to override, but no you dont have to override it. If you don’t, the base class version will be called instead. But if you do override it, even if you cast the object to it base class type, the derived version of the method will be called, unlike for hiding the method with new.
It’s good to know the difference between overriding and hiding the method, since at first glance, and if you test it, it might look like it does the same thing, but will come back to bite you later when the program don’t work as expected, and you have no idea why.