The Liskov Substitution principle states that you should write your class inheritance such that swapping subtypes for their base types wont change the behavior of your application by doing so.

However, the virtual keyword literally seems to exist to allow a subtype to behave differently from the base type. Wouldn't most uses of the virtual/override keywords (not including overriding abstract members) be likely to violate Liskov? I feel there may be more nuance to this than I'm understanding. Perhaps this is a case where "The rules exist to be broken sometimes" or perhaps there is a grey area to the "not behave differently" part of the principle.