Jeśli zachodzi sytuacja druga, powiemy, że metoda foo() jest metodą wirtualną. W niektórych językach (np. C++) metody muszą być jawnie deklarowane jako wirtualne przez programistę. W innych (np. Java) wszystkie metody są z definicji wirtualne.

W ogólnym ujęciu podtypowanie i dziedziczenie to dwa różne pojęcia. Dziedziczenie dotyczy powtórnego wykorzystania klasy bazowej, natomiast podtypowanie (polimorfizm) możliwości wykorzystania podtypu w miejscu nadtypu.

Ograniczenia Dziedziczenie posiada kilka ograniczeń wynikających z faktu, że hierarchia klas jest ustalana w momencie kompilacji programu i nie może podlegać późniejszym zmianom. Wyobraźmy sobie klasę Osoba, z której dziedziczą klasy Pracownik oraz Student. Napotykamy tutaj na istotne problemy:

Pojedynczość — w językach z pojedynczym dziedziczeniem osoba może być albo pracownikiem, albo studentem. Niezmienność — nawet jeśli skorzystamy z wielokrotnego dziedziczenia i utworzymy klasę StudentPracownik, klasę wybieramy w momencie tworzenia obiektu i nie możemy jej później zmienić.