Они служат разным целям. Шаблоны могут быть использованы только для статического полиморфизма: когда типы операндов известны на стадии компиляции. Если вам нужно изменение поведения в рантайме (если вы используете указатели/ссылки на базовый класс), то без виртуальных функций не обойтись.