Virtual resources are pretty well documented here: https://docs.puppetlabs.com/puppet/latest/reference/lang_virtual.html
Essentially, they let you define a resource to be later inserted into the catalog only when instructed to do so with the
realize function or with a resource collector. They function similar to the way that you can define a class and then
include it into the catalog in many different places without triggering a duplicate declaration error.
Defined resource types are simply a wrapper around a number of other resources so you can refer to a group with some kind of shorthand that makes more sense to you. This page has the complete documentation:
I've never tried it, but I don't think there's any reason that a defined resource type couldn't also include a virtual resource definition or declaration. I haven't seen that in any code I'm come across, either.
I hope that helps, but if you have further questions, please post them here.