Вы не можете, потому что память выделяется до вызова конструктора, исходя из размера нового типа, а не операнда копирования. И если бы это сработало, то это был бы особый случай, который инвертировал полиморфизм для ряда языковых конструкций.
Но это не значит, что это невозможно сделать с помощью небольшой магии C ++. :)
Есть несколько случаев, когда это невероятно полезно, например, сериализация не-POD классов. В этом примере создается конструктор виртуальной копии, который работает с использованием размещения new.
Предупреждение. Это пример, который может помочь некоторым пользователям с конкретными проблемами. Не делайте этого в общем коде. Сбой, если память, выделенная для нового класса, меньше, чем производный класс. Лучший (и единственный) безопасный способ использовать это, если вы управляете собственной памятью класса и используете новое размещение.
class VirtualBase
{
public:
VirtualBase() {}
virtual ~VirtualBase() {}
VirtualBase(const VirtualBase& copy)
{
copy.VirtualPlacementCopyConstructor(this);
}
virtual void VirtualPlacementCopyConstructor(void*) const {}
};
class Derived :: public VirtualBase
{
public:
...
Derived(const Derived& copy) : ... don't call baseclass and make an infinite loop
{
}
protected:
void VirtualPlacementCopyConstructor(void* place) const
{
new (place) Derived(*this);
}
};