From a design point, I can think of a few ways to do this.
1) Create a class (blueprint/c++) for each of your player classes (i.e. warrior, mage) and each of these classes (blueprint/c++) will contain different skills and stats. When the player reaches level 10 let them select a player class, the class (blueprint/c++) for your player can have an array or list of player classes so when the player reaches level 10 just add the selected player class to the array/list. All of the player classes could inherit from a base player class as they would contain common data like skills and stats.
2) Create an array of skills, each skill has a requirement such as required player class or stats. When the player reaches level 10 they select a player class (i.e. mage), this sets a boolean in the player class (blueprint/c++). The player can use/unlock skills that they meet the requirements for, such as fireball requires the player to be a mage. There could be a few ways to implement this type of approach, like do you have an array of skills that you can lookup and copy learnt skills into the player class (blueprint/class) or do just have a dynamic array of pointers that points to skills that the player knows in this array of skills?
3) The player class (blueprint/c++) knows all the possible skills that can be learnt, a bit like idea 2, but each skill has a requirement. When the player reaches level 10 and selects a class, you unlocked the skills that you mean the requirements for. You wouldn't need any other classes (blueprint/c++) in order to find available skills and which ones the player has unlocked.
There are pros and cons to each of these approaches, some would be better if you want to add new skills/classes down the line, whereas others would be simpler to implement.
Do the points make sense? I can get a little confusing talking about a player class system and the blueprints/c++ classes to create it - too many of the word classes with a different meaning!