идиома копирования и обмена с наследованием - PullRequest
6 голосов
/ 22 сентября 2011

Я прочитал интересные вещи об идиоме копирования и обмена. Мой вопрос касается реализации метода 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 ???
    }
    .../...
};

Ответы [ 3 ]

11 голосов
/ 22 сентября 2011

Вы бы поменялись подобъектами:

swap(static_cast<Bar&>(a), static_cast<Bar&>(b));

Возможно, вам потребуется реализовать функцию подкачки для Bar, если std::swap не выполняет работу.Также обратите внимание, что swap должен быть не членом (и другом, если необходимо).

2 голосов
/ 22 сентября 2011

Просто приведите его к базе и дайте компилятору разобраться:

swap(static_cast<Bar&>(a), static_cast<Bar&)(b));

0 голосов
/ 22 сентября 2011

Обычно вы делаете это так:

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);
    }
    .../...
};
...