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);”对私有基类成员没有评论??通常会实现自定义复制运算符,因为有额外的特殊情况处理,例如指针。此类额外的关键逻辑应该存在于交换函数之外,也可以包括私有成员。答案仅显示如何处理交换,但保留“复制”部分习语没有回答。有人有一个好的模式来实现整个习语的继承吗?