uvm_object_wrapper is an abstract base class with no parameters. It contains the virtual methods create_* and get_type_name. The other methods are static and use the parameterized extended class type. The create() method must have a return type that matches the parameter type.
Indeed, the get and create methods can’t be placed in uvm_object_wrapper because they depend on the type parameter T. At first, I didn’t understand what the issue was with the static methods set_type_override and set_inst_override, since their prototypes don’t depend on T and static method can be placed in an abstract class. Then I realized that static methods cannot be virtual, so they cannot be overridden by derived classes.
So, is this more of a technical limitation rather than an intentional design choice?