polymorphism is behavior that varies depending on the class in which the behavior is invoked. For example, the result of bark() for a Dog would differ from the result of bark() for a Jackal; and in a more sophisticated animal-emulation program, bark() would differ for a Chihuahua and a Saint Bernard.
This definition is a little incomplete in my opinion. I am going to borrow a line from Raymond Lewallen (who did a great series on the 4 principles of OOP a while back) where he says that while polymorphism can be coupled with inheritance (as is implied by the wikipedia definition above) it does not require inheritance. You can see polymorphism at work in one class in the form of overloading. You can see polymorphism at work when implementing interfaces (covered later) that allows you to treat one object type like another if they share common interfaces. You can see polymorphism at work in inheritance via overriding inherited behaviors. Generics available in C# 2.0 are a type of polymorphism at work (called parametric polymorphism). A lot of that is way beyond the scope here. I only want to discuss overloading and overriding here, because those are the least complicated and the most often encountered when you first begin OOP and this is just an overview article. Polymorphism is one of those things that you can talk about for days and still not see the end of. Because of the many places you can see it at work, it’s one of the hardest parts of OO to define, and to fully understand, until you see it from all its different sides.
Overloading is a type of polymorphism (sometimes called ad-hoc polymorphism) where you essentially have multiple functions that perform the same task, return the same thing, and have the same name. They differ in the number and/or type of arguments passed in. Some will say that method overloading is not polymorphism. Others will say it is. I’m not here to deal in academics. In the real world, overloaded behavior is considered to be polymorphic behavior, at least in the sense that from the perspective of the consumer of the API it’s polymorphic, but maybe in the perspective of the author it’s just syntactic sugar for multiple methods. Overloading is important to understand and is a key feature of OOP, and I’m putting it under polymorphism. Deal. If you know enough about it to argue with me about whether or not it goes here…this post ain’t for you bub. :P