The cost of a virtual function stems from the inability to inline calls that are dynamically bound at run-time. The only potential efficiency issue is the speed gained from inlining if there is any. Inlining efficiency is not an issue in the case of functions whose cost is not dominated by call and return overhead.
Templates are more performance-friendly than inheritance hierarchies. They push type resolution to compile-time, which we consider to be free.