Poczytaj o programowaniu obiektywem. Jego teoretycznym celem jest odzwierciedlanie świata rzeczywistego wykorzystując klasy oraz ich instancje.
Moim zdaniem próbując dziedziczyć ze stringa pokazujesz że nic nie chwytasz. std::string to tak naprawdę base_string<char>, cała jego funkcjonalność jest publiczna. Dziedzicząc prywatnie zamykasz ją w klasie pochodnej i co tam będziesz robić? Pomijam już to, że pochodna nazywa się Gracz, bo to dla mnie pomyłka.
Btw. Czasem granica między wyborem dziedzicz albo zawieraj jest bardzo cienka. Wtedy lepiej zawierać.