1. Мне кажется steal не очень удачное название, так как может запутать. В C++ есть присваивание (assignment) где правый аргумент сохраняет значение и перемещение(move) где правый аргумент передает значение левому и теряет собственное (например строка становится пустой).
Ваш код выглядит как assingn. В этом случае правый аргумент from правильнее сделать константным, так как менять его вы не планируете.
void assignDataFrom(OverrideableInt& to, const OverrideableInt& from)
2. >Как этому Item’у автоматически прописать stealDataFrom?
Автоматически генерировать код в C++ пока нельзя. Reflection ожидается в будующих стандартах, но пока он есть только в виде эксперементальных реализаций.
3. Оператор присваивания будет сгенерирован по умолчанию, если не определять его самостоятельно. Он будет использовать операторы присваивания всех нестатических полей класса. Получается для Item сгенерированный по умолчанию оператор сделает то, что вам нужно, если для OverrideableInt он определен правильно.
4. assignDataFrom может использовать этот сгенерированный оператор.
void assignDataFrom(Item& to, const Item& from) {
to = from;
}
Так вы сможете написать обобщенную шаблонную функцию.