Kompozycja przez dziedziczenie to metodologia programowania używana w językach programowania obiektowego w celu ustanowienia bardziej dynamicznych i zmiennych relacji między obiektami w aplikacji. Podstawowym formatem kompozycji nad dziedziczeniem jest uwzględnienie instancji obiektu wewnątrz innego obiektu. Różni się to wyraźnie od metody dziedziczenia zorientowanej obiektowo, ale może służyć temu samemu celowi w wielu modelach. Zaletą kompozycji nad dziedziczeniem są dobrze zdefiniowane granice między obiektami złożonymi a obiektami opakowującymi, możliwość zmiany implementacji obiektu bez wpływu na całą hierarchię dziedziczenia oraz mniej restrykcyjne ramy dla początkowego projektowania programu. Niektóre z komplikacji mogą jednak obejmować trudności w serializacji i nadmiernie złożone struktury w dużych, ugruntowanych programach.
W programowaniu obiektowym jedną z cech, które należy ustalić podczas projektowania, jest to, jak różne obiekty odnoszą się do siebie. Dziedziczenie jest centralnym mechanizmem w programowaniu obiektowym i pozwala jednemu obiektowi dziedziczyć wszystkie dane i metody swojego rodzica, które może następnie dodawać, modyfikować lub rozszerzać za pomocą własnej implementacji. Przykładem projektowania opartego na dziedziczeniu może być program, który ma jedną główną klasę, która definiuje samochód i modeluje pewne ogólne atrybuty wszystkich samochodów. Klasa dla każdej marki samochodu jest następnie tworzona jako potomek klasy głównej, ale definiuje określone informacje, takie jak rozmiar silnika, pojemność paliwa lub inne informacje specyficzne dla tej konkretnej marki samochodu.
Kompozycja jest wyrażona przez uwzględnienie wystąpień obiektów w innych obiektach. Jeśli istnieje główna klasa, która definiuje ogólny samochód, to zamiast tworzyć podklasy dla określonych marek samochodów, główna klasa może zamiast tego zawierać wystąpienia innych obiektów, które bardziej szczegółowo definiują samochód. Może to oznaczać, że główna klasa samochodu może zawierać obiekt dla typu silnika i obiekt dla pojemności paliwa, który zostanie ustawiony, gdy klasa zostanie użyta do utworzenia instancji określonej marki samochodu.
W przypadku kompozycji nad dziedziczeniem obiekty zawarte w klasie głównej nie są bezpośrednio związane z klasą główną, co daje programistom swobodę zmiany sposobu działania poszczególnych obiektów. Problemem, któremu może zapobiec kompozycja nad dziedziczeniem, jest sytuacja, w której drzewo dziedziczenia może być zbyt głębokie, co oznacza, że wszelkie modyfikacje klasy w drzewie mogą wymagać zmian na całej długości drzewa. Nie wszystkie języki zorientowane obiektowo obsługują dziedziczenie wielokrotne, a kompozycja nad dziedziczeniem jest metodą, której można użyć do obejścia tego ograniczenia.