ValueObject inherits from UserID which is just a bad idea:
- The inheritance gives ValueObject some member functions that are at best misleading (such as Clear() which doesn't clear any value beside id).
- It allows passing ValueObject to the overloaded operators for UserID (such as == or << which won't actually compare or print anything in the ValueObject).
- It exposes the SetID and Clear which both allow users to change the internal id value.
Similar to D91699 which did the same for Process
This makes more sense, ValueObject is not a UserID but contains one.