это безопасно сделать что-то вроде этого:
class Base { public: int x; };
class Derived : public Base { public: int y; };
Base b;
Derived d;
b.x = 1;
d.x = 2;
d.y = 3;
std::swap(b,d);
На этом этапе гарантируется, что производная информация d.y все еще действительна? Другими словами, я только меняю базовый объект, но производные данные все еще действительны, правильно? Кроме того, это считается нарезка?
РЕДАКТИРОВАТЬ: В комментариях было указано, что это не скомпилируется. Какой лучший способ поменять базовые данные в d на b? Имейте в виду, что b очевидно намного сложнее, чем я привел в своем примере.
Все зависит от того, что ваше определение действительный и насколько точен объем вопроса. В общем случае, просто поменять базы не будет действительный, поскольку производный тип может применять дополнительные инварианты, которые могут быть нарушены.
В конкретном случае у вас есть, без инвариантов, все общедоступные данные (после исправления определений типов, так что код ниже компилируется), данные будут поменяны местами и, скорее всего, не вызовут никаких проблем (предположим, что изменение в свопе может быть сделано вручную путем прямого доступа к членам, поэтому swap
не ломается ничего, что иначе не сломалось бы).
Других решений пока нет …