I have a class hierarchy, and each class in it has an exception class, derived in a parallel hierarchy, thus...
class Base { }; class Derived : public Base { };
The "reason" of the exception is most likely something that needs to be shown to the user or to be logged, so a string seems more appropriate, so it can be used in what(). If it is more than that, more subclassing is needed.