In reply to rakesh2learn:
Your question really should be: "what code should we put in the constructor versus any other class method?"
There are at least two independent issues. One is when you extend a class, you cannot override the constructor, you can only append to it. So you can't prevent the driver from being constructed. You should put the bare minimum amount of code in a class constructor.
The other issuer is getting the randomization seed to each object. You didn't show the code for how the env classes get constructed and the run method gets called, but I'm assuming you are using OVM/UVM or something similar. The run phases of these classes all get forked in parallel, so your chances of random stability are diminished when using the run phase.