Hierarchia klas, zwana także taksonomią klas, to grupa powiązanych ze sobą klas, które są połączone poprzez dziedziczenie, aby robić podobne rzeczy. Szczyt hierarchii może być pojedynczą klasą bazową, z której pochodzą wszystkie inne klasy poniżej, lub hierarchia może mieć wiele klas bazowych, których funkcje łączą się później w co najmniej jednej klasie pochodnej. Relacje między klasami można zilustrować jako drzewa, a każde mniejsze drzewo w dużej taksonomii można również uznać za hierarchię.
Nie wszystkie hierarchie klas mogą mieć wiele korzeni, a struktura każdej hierarchii klas zależy w dużej mierze od języka, w którym jest napisana. C++ umożliwia wielokrotne dziedziczenie, więc złożone hierarchie mogą być budowane z wieloma korzeniami i wieloma drzewami, które łączą się ze sobą. Z drugiej strony Java® jest ograniczona do pojedynczego dziedziczenia, więc jej relacje klasowe są zwykle prostsze, zbudowane jako stosunkowo samodzielne drzewa z jednym korzeniem. Dziedziczenie interfejsów może zwiększyć złożoność hierarchii klas w Javie®, ale interfejsy prawie nigdy nie są wywoływane w tak złożonej strukturze, że przypominałoby to łączenie ze sobą drzew.
Składniki hierarchii klas mogą różnić się rodzajem i funkcją, o ile zasady języka są zawsze przestrzegane w odniesieniu do dziedziczenia. Klasy w hierarchii mogą być publiczne, chronione, abstrakcyjne, konkretne lub wirtualne. Można również używać interfejsów, funkcji globalnych i znajomych. W zależności od języka komputerowego niektóre z tych typów mogą być lepiej dziedziczone niż inne. Ogólnie rzecz biorąc, hierarchie są bardzo elastyczne i mogą być używane na wiele sposobów do wielu celów.
Nie ma sztywnych reguł dotyczących hierarchizacji poszczególnych typów klas. Każda klasa może być dowolnym z wymienionych powyżej typów. Ogólnie rzecz biorąc, ostatnie klasy w hierarchii, które nie mają poniżej klas pochodnych, powinny być publiczne i konkretne. Ponieważ jednak mogą również istnieć czysto abstrakcyjne hierarchie klas, jest to tylko praktyczna zasada.
Chociaż hierarchia klas może być użytecznym narzędziem do organizowania kodu i enkapsulacji funkcjonalności, może się zdarzyć, że zbyt głębokie zagłębienie się w hierarchię może faktycznie zmylić kod, zamiast wyjaśniać go i ułatwiać utrzymanie. Budowanie solidnych relacji między wieloma klasami wymaga pewnej dozy przewidywania; chociaż początkowo może być łatwiej rozbić kod na wiele małych kawałków, później te małe kawałki mogą stać się trudniejsze w obsłudze. Po prawidłowym zbudowaniu hierarchia klas pomaga zarówno programistom, jak i użytkownikom w określaniu sposobu działania klas. Jeśli jest zbudowany bez konserwacji i przejrzystości, wiele poziomów dziedziczenia może być mylących, aby spojrzeć wstecz i zrozumieć.