Polimorfizm statyczny i dynamiczny Wiele mechanizmów polimorficznych można napisać ręcznie, jednak wiąże się to często z koniecznością powielania kodu z jedynie niewielkimi poprawkami, a co za tym idzie rozrost kodu źródłowego i jego zaciemnienie. Istotą polimorfizmu jest, aby to system decydował o szczegółach, a nie programista. Przez system należy tu rozumieć kompilator i system czasu wykonania.
Niektóre decyzje mogą być podjęte już na etapie kompilacji, mamy wtedy do czynienia z polimorfizmem statycznym (czasu kompilacji). Czasami jednak decyzja musi zostać odłożona do momentu wykonywania programu – polimorfizm dynamiczny (czasu wykonania). Przykładem statycznego może być przeciążanie operatorów – to, którą wersję operatora należy wywołać, można ustalić podczas kompilacji, natomiast dynamicznego – metody wirtualne – konkretna wersja metody może być ustalona dopiero w czasie wykonywania programu.
Polimorfizm uniwersalny Pozwala pisać ogólne struktury danych i algorytmy, bez precyzowania na jakich dokładnie typach one operują i bez konieczności dostarczania implementacji odpowiednich dla każdego przypadku.