I am not sure whether I got your question correctly, but here my comments based on my understanding:
1. You can define the virtual function in parent class as GetUserType() and implement the same in the derived class
which returns their own type.
2. Generally for the permission, Enum is preferred datatype to use. Because it is value-type whereas class will be reference type which ask for more processing.
But at the end of the day it all depends on the requirements of your application.