C++ 复制和交换习惯用法,带继承
我读过关于复制和交换的习语。我的问题是关于从另一个类继承时C++ 复制和交换习惯用法,带继承,c++,inheritance,idioms,C++,Inheritance,Idioms,我读过关于复制和交换的习语。我的问题是关于从另一个类继承时swap方法的实现 class Foo : public Bar { int _m1; string _m2; .../... public: void swap(Foo &a, Foo &b) { using std::swap; swap(a._m1, b._m1); swap(a._m2, b._m2);
swap
方法的实现
class Foo : public Bar
{
int _m1;
string _m2;
.../...
public:
void swap(Foo &a, Foo &b)
{
using std::swap;
swap(a._m1, b._m1);
swap(a._m2, b._m2);
// what about the Bar private members ???
}
.../...
};
只需将其转换到基础,然后让编译器进行计算:
swap(static_cast(a),static_cast您将交换子对象:
swap(static_cast<Bar&>(a), static_cast<Bar&>(b));
swap(静态广播(a)、静态广播(b));
如果std::swap
不起作用,您可能需要为Bar
实现交换功能。还要注意的是swap
应该是非成员(必要时是朋友)。您通常会这样做:
class Foo : public Bar
{
int _m1;
string _m2;
.../...
public:
void swap(Foo &b)
{
using std::swap;
swap(_m1, b._m1);
swap(_m2, b._m2);
Bar::swap(b);
}
.../...
};
除非Bar
没有实现一个Bar::swap(Bar&b)
。请看我发布的关于内部/外部方法的链接。好的,你的方法没有声明为static或friend,所以我很困惑,但我没有阅读链接,这是我的错。为了避免强制转换,你可以执行“Bar&a\u Bar=a,&b\u Bar=b;swap(a\u Bar,b\Bar);”对私有基类成员没有评论??通常会实现自定义复制运算符,因为有额外的特殊情况处理,例如指针。此类额外的关键逻辑应该存在于交换函数之外,也可以包括私有成员。答案仅显示如何处理交换,但保留“复制”部分习语没有回答。有人有一个好的模式来实现整个习语的继承吗?