przynajmniej kilka klas, w tym przynajmniej jedna klasa abstrakcyjna (lub interfejs)
dziedziczenie
przeciążenie metod
konstruktory i destruktory, w tym konstruktor kopiujący
poprawna hermetyzacja danych
przeciążenie operatorów, w tym dociążony operator przypisania
wykorzystanie kolekcji szablonowej (lub nawet utworzenie własnej klasy, metody lub funkcji szablonowej)
wykorzystanie algorytmów operujących na kolekcjach szablonowych
operacje na plikach (odczyt, zapis danych)
logiczna organizacja projektu w osobnych plikach źródłowych i nagłówkowych
wykorzystanie metod wirtualnych
właściwe użycie typów
dbałość o czytelność kodu