The LSP says "The derived types must not change the behavior of the base types", in other words "Derived types must be completely replaceable for their base types."
This means that if we define virtual methods in our base classes, we have violated this principle.
Also if we hide a method in the drive method by using new keyword then again we have violated this principle.
In other words, if we use polymorphism we have violated LSP!
In many applications I've used Virtual methods in the base classes and now I realize it violates LSP. Also if you use Template Method pattern you have violated this principle that I've used it a lot.
So, how to design your application that complies with this principle when you'd need inheritance and you'd like to benefit also from polymorphism? I'm confused!
See the example from here: http://www.oodesign.com/liskov-s-substitution-principle.html