когда вы сделаете следующее в своем коде:
A* ptr = new A(obj);
вы всегда получите экземпляр A.obj будет рассматриваться как A, а новый A будет создан на основе «части A» obj.
Лучший подход, как указано в предыдущем ответе, добавить виртуальный метод MakeCopy в базовый класс иреализовать его для производных классов.
virtual A* MakeCopy();
Этот метод реализован путем создания копии объекта, для которого он вызван.Затем он реализуется в производных классах, поэтому, если у вас есть указатель A, который на самом деле является объектом B, вы получите истинную копию B и избежите "нарезки", которая происходит в вашем примере.