This seems like it would really depends on the use case. An ideal solution, wherever possible is to minimize the number of function calls and then iterate on an arrays of data inside that one function, as that would be better in terms of cache and function call overhead.
Using a virtual function is likely to be cleaner in C++, as you do not need to write code to bind it at runtime. In terms of performance the difference seems likely to be minimal, unless there are multiple functions bound to the same delegate or you have many, many actors that are all overlapping. If it were the latter case, then using a single function to iterate over all the actors at once would likely be a better optimization.
If you are interested, you could try to profile this either using the CSV profiler using a scoped timing stat or using Unreal Insights.