Are used for inherited classes when you need a different behaviour from said method as defined in the base class.
The act of doing so is called superseeding and if you've used Godot long enough you'll realize that you've been doing this all along.
virtual func _ready():
print("get node ready")
class Control extends Node:
print ("do something else")
var ctrl = Control.new()
So by default all sub classes will have the
ready method and be able to change it's operation.
With a normal method this is not so infact the complier may throw an error saying that the function cannot be redefined meaning in the example above the inherited Class will still have the ready method but what ever is defined in the base class will be the operation for every class that extends it or subclasses