The typical pattern when you want to copy a polymorphic class is adding a virtual clone method and implement it in each derived class like this:
Base* Derive
You can at minimum avoid writing the class name by getting it from the type of the class itself with:
struct A: public Base
{
Base* Clone() { return new std::remove_reference_t(*this); }
};
Using CRTP will not help avoid duplicating the class name again, as you than have to write the class name inside the template parms for the CRTP base.