przynajmniej kilka klas, w tym przynajmniej jedna klasa abstrakcyjna (lub interfejs)
logiczna organizacja projektu w plikach źródłowych i nagłówkowych
dziedziczenie
przeciążenie metod
wykorzystanie metod wirtualnych
konstruktory i destruktory, w tym konstruktor kopiujący oraz konstruktor domyślny
poprawna hermetyzacja danych, odpowiednie użycie modyfikatorów dostępu (public, private, protected)
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)
właściwe użycie typów danych, w tym typów wskaźnikowych i referencyjnych
obsługa wyjątków, w tym utworzenie własnych klas wyjątków
czytelność kodu, w tym odpowiednie nazewnictwo zmiennych, funkcji i klas, a także formatowanie kodu
wykorzystanie dynamicznego przydziału pamięci (new, delete)