C ++派生对象数据在基础对象std :: swap后保证有效吗?

时间:2013-08-26 17:46:47

标签: c++ swap object-slicing

做这样的事情是安全的:

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显然要比我的例子复杂得多。

1 个答案:

答案 0 :(得分:3)

这完全取决于您对有效的定义是什么以及问题的范围有多精确。在一般情况下,仅交换基础将不是有效,因为派生类型可能会强制执行可能被破坏的其他不变量。

在特定情况下,您没有不变量,所有公共数据(在修复类型定义以便下面的代码编译之后)数据将被交换,并且很可能不会导致任何问题(假设:交换可以通过直接访问成员来手动完成,因此swap不会破坏任何不会被破坏的内容。