Вы не можете, потому что память выделяется до вызова конструктора на основе размера нового типа, а не операнда копирования. И если бы это сработало, это был бы особый случай, когда инвертированный полиморфизм для ряда языковых конструкций.
Но это не значит, что это невозможно сделать с помощью небольшой магии C ++. :)
Есть несколько случаев, когда это невероятно полезно, например, сериализация классов, отличных от POD. В этом примере создается виртуальный конструктор копий, который работает с использованием нового места размещения.
Предупреждение. Это пример, который может помочь некоторым пользователям с определенными проблемами. Не делайте этого в коде общего назначения. Он сработает, если память, выделенная для нового класса, меньше, чем производный класс. Лучший (и единственный) безопасный способ использовать это, если вы управляете собственной памятью класса и используете новое место размещения.
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);
}
};
Обходным путем для этого может быть динамическое добавление <span>
к элементу и назначение ему метода щелчка. Как эта скрипка.
var item = $('<span />');
item.click(function() { alert('click'); });
$('div').append(item);
CSS
div { position:relative; background-color:#333;
padding:20px; margin:20px; float:left;
}
div span { content:""; display:block;
padding:5px; background-color:#f60; border:2px solid white;
position: absolute; top:-2px; right:-2px; border-bottom-left-radius: 10px;
}
Моя цель была решена с помощью другого обходного пути, который заключается в добавлении дочернего DIV. Заключение всех дочерних элементов внутри родительского элемента в этот новый дочерний DIV:
Мой рабочий пример такой же, как и в постановке задачи: См. Fiddle
HTML:
<div class="parentDiv">
:before
<div class="childDiv">
<!-- child elements -->
</div>
</div>
** Примечание: игнорировать :before
в HTML, просто показывая, чтобы понять.
CSS:
div.parentDiv{position:relative; background-color:#333; padding:0; margin:20px; float:left; }
div.parentDiv:before { content:""; display:block; padding:5px; background-color:#f60; border:2px solid white; position: absolute; top:-2px; right:-2px; border-bottom-left-radius: 10px; cursor:pointer}
div.childDiv{padding:20px; margin:0}
jQuery:
jQuery(document).ready(function($){
$('div.parentDiv').click(function(e){
if( $(e.target).closest('.childDiv').length==0 ){
//so clicked on psudo :before element!
//do your work here ;)
alert('Psudo :before element is clicked!');
}
});
});