They are effectively the same. While there is a difference with non-virtual destructors, once you stick virtual
in there, it cannot be trivial anymore.
This is not the only time that = default
leads to the generation of a non-trivial special member function. For example, if you have a member that has a non-trivial destructor, then using = default
will not cause the creation of a trivial destructor for the containing type, even with a non-virtual destructor.
You should use = default
anyway, just to make it clear what your intentions are.