Типичный шаблон, когда вы хотите скопировать полиморфный класс, - это добавить метод виртуального клона и реализовать его в каждом производном классе следующим образом:
Base* Derived::clone()
{
return new Derived(*this);
}
Тогда в коде вызова вы можете:
Base *x = new Derived();
Base *y = x->clone();
Однако, если у вас есть производные классы 50+ и вы понимаете, что вам нужна полиморфная копия, утомительно копировать и вставлять метод клонирования в каждый из них. И это, по сути, шаблон, который работает вокруг языкового ограничения, которое вы должны указать фактическое имя для вызова конструктора.
Я не отслеживал новые функции в последних стандартах C++... Есть ли способ избежать этого в современном C++?