Kurz erklärt
Die Fähigkeit, denselben Methodenaufruf auf unterschiedlichen Objekttypen aufzurufen und dabei je nach tatsächlichem Objekt ein anderes Verhalten zu bekommen — "eine Schnittstelle, viele Formen".
Genauer
Klassisches Beispiel: Eine Liste unterschiedlicher Tier-Unterklassen (Hund, Katze) wird einheitlich als "Tier" behandelt, aber ein Aufruf von machGeraeusch() führt bei jedem Objekt die jeweils eigene, überschriebene Version aus. Möglich wird das durch Vererbung oder durch ein gemeinsames Interface, das mehrere Klassen implementieren, ohne miteinander verwandt zu sein.