Ответы, которые вы получили, хороши и объясняют, что такое полиморфизм. Я думаю, что это также может помочь понять некоторые причины, по которым это полезно.
В некоторых языках, в которых отсутствует полиморфизм, вы попадаете в ситуации, когда вы хотите выполнить концептуально одну и ту же операцию над различными типами объектов, в тех случаях, когда эта операция должна реализовываться по-разному для каждого типа. Например, в Python-подобном синтаксисе:
def dosomething(thing):
if type(thing)==suchandsuch:
#do some stuff
elif type(thing)==somesuch:
#do some other stuff
elif type(thing)==nonesuch:
#yet more stuff
Есть некоторые проблемы с этим. Самым большим является то, что это вызывает очень сильную связь и много повторений. Скорее всего, у вас будет такой же набор тестов во многих местах вашего кода. Что произойдет, если вы добавите новый тип, который должен поддерживать эту операцию? Вы должны найти каждое место, где у вас есть этот вид условия, и добавить новую ветку. И, конечно, у вас должен быть доступ ко всему задействованному исходному коду, чтобы иметь возможность вносить эти изменения. Поверх этой условной логики, подобной этой, многословно, и ее трудно понять в реальных случаях.
Лучше просто написать:
thing.dosomething()
Вдобавок к тому, что намного короче, это приводит к гораздо более слабой связи. Этот пример / объяснение ориентирован на традиционные ОО-языки, такие как Python. Детали немного различаются, скажем, в функциональных языках. Но общая польза от полиморфизма остается прежней.