Х>а что мешает сделать метод Assign виртуальным и переопределить его только у тех наследников, для которых актуально более "умное" поведение?
Я когда-то так делал.
возникают нюансы:
class A {
virtual void operator=( const A& );
};
class B : public A {};
class C : public A {};
A a; B b; C c;
c = b; // проходит на ура, хотя вряд ли так задумывалось программистом.
Ну и внутри A::operator=(const A&) сложно узнать правильный sizeof( *this )
Так что я бы не парился и оставил реализацию оператора присваивания компилятору, за исключением случаев, где
необходимо что-то особенное.
Благо нормальный компилятор копирование сложной структуры из POD приводит к проинлайненому memcpy,
а если там не-POD, то тогда всякие memcpy -- это именно грабли.