Klasę abstrakcyjną tworzysz wtedy, gdy masz pewną rodzinę obiektów. Obiekty te należą do jakiejś hierarchii, są podobne, ale mają różnice. Weźmy na przykład figury geometryczne. Każda figura ma jakieś pole i obwód. Czy jesteś w stanie zdefiniować wzory dla obiektu figura? Nie. A dla kwadratu i prostokąta? Tak. Jeśli masz metodę abstrakcyjną, to dzięki temu możesz wywołać na wszystkich obiektach typu kwadrat oraz prostokąt metodę oblicz pole, mimo że ich implementacja będzie inna.
Po co metody wirtualne? Może się okazać, że w większości przypadków metoda z klasy bazowej nadaje się dla obiektów z klas pochodnych. Jeśli okaże się, że w klasie pochodnej należy zmienić metodę, to zmienisz ją tylko w klasie pochodnej, w pozostałych klasach będzie wywoływana metoda z klasy bazowej.