In reply to svq:
Unfortunately, the UVM is much more complicated than it needs to be due to its history. It is expecting that everyone is using the macros to register the class with the factory. You are not supposed to override clone() or copy(), so it really doesn’t matter if they are virtual or not in that case.
uvm_object::clone() calls the virtual create() method that get inserted by the `uvm_object_utils macro in each derived class. There is no do_clone() method; the create() method is taking the place of that.
You are correct about do_copy(). After calling create(), uvm_object::clone(), calls uvm_object::copy, which then calls the virtual do_copy().