przynajmniej kilka klas, w tym przynajmniej jedna klasa abstrakcyjna (lub interfejs)
dziedziczenie
przeciążenie metod
konstruktory i destruktory
poprawna hermetyzacja danych
przeciążenie operatorów
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