вызов оператора = из производного класса - PullRequest
0 голосов
/ 24 апреля 2011

Это из пункта 16 действующего С ++ 2-го издания Скотта Мейерса (стр. 70)

Автор без особого объяснения пишет, что когда оператор базового класса вызывается следующим образом

Base::operator=(rhs);

какой-то компилятор (хотя и неправильно) отклоняет это, если operator = был , сгенерированный компилятором (см. Пункт 45), так что лучше использовать

static_cast<base&>(*this) = rhs;

в пункте 45 он упоминает, что если базовый класс operator = является закрытым, производный класс = не имеет права вызывать его.

но в оригинальном вопросе компилятор отклонил его, потому что он был сгенерирован компилятором (который должен быть публичным)

любая помощь (ссылка) по этому вопросу будет полезна. (гуглить такие вопросы очень сложно)

1 Ответ

3 голосов
/ 24 апреля 2011

но в оригинальном вопросе компилятор был отвергая его, потому что он был создан компилятором (который должен быть публичным)

Может быть, я понимаю, что вы хотите.

Оператор присваивания, созданный компилятором, становится открытым. Но пункт 16 не об уровне доступа. static_cast<base&>(*this) - это обходной путь для неработающих компиляторов. В пункте 16 Скотт Мейерс говорит, что обходной путь может потребоваться, когда компилятор генерирует оператор присваивания базового класса. Кстати, многое изменилось с момента выхода второго издания. Третье издание больше не упоминает обходной путь.

Относительно частных операторов присваивания. В пункте 45 говорится, что если оператор присваивания базового класса был сделан закрытым, то компилятор не может сгенерировать оператор присваивания для производного класса, поскольку сгенерированный компилятором оператор присваивания опирается на оператор присваивания базового класса. В этом случае вам придется вручную написать оператор присваивания для производного класса или оставить производный класс без оператора присваивания.

...