when you follow below in your code:
A* ptr = new A(obj);
you always get a copy of A. obj will be considered as A, and a new A will be created based on the "A-part" of obj.
The best approach is as an earlier answer, add a virtual MakeCopy method to the base class and implement it for derived classes.
virtual A* MakeCopy();
, . , , A, B, B "", .