Dziedziczenie w programowaniu obiektowym to naprawdę mocny mechanizm – moim zdaniem jeden z najważniejszych, jakie daje OOP. Pozwala na tworzenie nowych klas (czyli tzw. klas pochodnych) na bazie już istniejących (klas bazowych). W praktyce wygląda to tak, że klasa dziedzicząca przejmuje pola i metody po klasie bazowej, ale może je też rozszerzyć lub zmienić według potrzeb. To jest bardzo wygodne, gdy chcemy uniknąć powielania kodu – raz zdefiniowane cechy, np. w klasie 'Pojazd', mogą być potem wykorzystane przez klasy takie jak 'Samochód' czy 'Motocykl'. Co ciekawe, różne języki programowania podchodzą do tego trochę inaczej – na przykład w Javie nie ma wielodziedziczenia klas, ale są interfejsy, a w C++ już można dziedziczyć po wielu klasach naraz, choć to bywa ryzykowne. Branżowe praktyki zalecają, żeby nie przesadzać z głębokością dziedziczenia, bo to może zaciemniać kod i utrudnić jego utrzymanie. Lepiej wykorzystywać kompozycję, gdy tylko się da, ale dziedziczenie świetnie się sprawdza do modelowania hierarchii i wspólnych zachowań. W realnych projektach bardzo często widać, jak dziedziczenie oszczędza czas i pozwala programistom skupić się na nowych cechach, a nie przepisywaniu tego samego od zera.
W programowaniu obiektowym zdarza się, że niektóre pojęcia łatwo mogą się ze sobą pomieszać, zwłaszcza jeśli ktoś zaczyna dopiero przygodę z tą tematyką. Wiele osób myli dziedziczenie na przykład z ochroną danych w klasie, czyli enkapsulacją. To zamykanie (prywatność pól czy metod) służy głównie temu, by nie dopuścić do przypadkowych modyfikacji ważnych właściwości obiektu z zewnątrz – nie ma natomiast nic wspólnego z budowaniem nowych klas na podstawie istniejących. Częsty błąd to również przekonanie, że dziedziczenie polega na tworzeniu nowych obiektów przez konstruktory. Konstruktory służą do inicjalizacji instancji danej klasy, ale nie mają wpływu na relacje między samymi klasami. Kolejnym mylnym tropem jest uogólnianie pewnych cech w klasie bazowej. Owszem, projektując hierarchię, najczęściej właśnie w klasie bazowej umieszcza się wspólne cechy, jednak sednem dziedziczenia jest przejmowanie tych cech przez klasy pochodne, nie samo ich uogólnienie. Moim zdaniem takie zamieszanie wynika z tego, że w praktyce te koncepcje często występują razem – projektując systemy obiektowe, korzysta się i z dziedziczenia, i z enkapsulacji, i z polimorfizmu, ale warto pamiętać, że każdy z tych mechanizmów odpowiada za coś innego. Najlepiej na przyszłość zapamiętać, że samo dziedziczenie to relacja „jest-a” między klasami – nowa klasa jest rozszerzeniem istniejącej i wykorzystuje jej funkcjonalności.