Why functions/tasks in UVM user defined classes are virtual?

I have seen recommendations in LRMs and in some articles such that

It’s better to keep methods in UVM classes as virtual

Why do we have to do so? What is the benefit?

In reply to bachan21:

Keeping your methods virtual lets you take full advantage of the power of object oriented programming, especially polymorphism. In fact you should only make your methods non-virtual if you have a really good argument for keeping them that way.