1

这样做是否安全:

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);

此时是否保证派生的信息 dy 仍然有效?换句话说,我只是在交换基础对象,但派生数据仍然有效,对吗?另外,这被认为是切片吗?

编辑:在评论中指出这不会编译。将 d 中的基础数据与 b 交换的最佳方法是什么?请记住,b 显然比我在示例中提出的要复杂得多。

4

1 回答 1

3

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

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

于 2013-08-26T17:56:44.217 回答