Это полностью безопасно. После создания экземпляра шаблона класса он становится обычным классом, как и другие классы.
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
class derived : base<int> {
public:
virtual void fn(int t){} //override
};
base<int> *pBase = new derived();
pBase->fn(10); //calls derived::fn()
Я также хотел бы отметить, что хотя в шаблоне класса разрешена виртуальная функция, в классе не разрешен шаблон виртуальной функции (как показано ниже):
class A
{
template<typename T>
virtual void f(); //error: virtual function template is not allowed
};