C ++, как работает noncopyable?

Как наследование некопируемого класса с помощью закрытого конструктора копирования и оператора присваивания запрещает использование конструктора копирования и оператора присваивания в производном классе? Пожалуйста, рассмотрите следующий сценарий, отвечая, индивидуально,

  • Что если конструктор копирования по умолчанию и оператор присваивания генерируются компилятором в производном классе и не добавляются программистом

  • Что если, конструктор Copy и оператор присваивания определены и объявлены общедоступными в производном классе программистом

  • Что если, конструктор Copy и оператор присваивания определены и объявлены закрытыми в производном классе программистом

0

Решение

Конструктор копирования по умолчанию и оператор присваивания генерируются компилятором в производном классе и не добавляются программистом

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

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

Тогда вы победили цель наследования от базового класса; Ваш производный класс теперь можно копировать с помощью этих функций.

Конструктор копирования и оператор присваивания определяются и объявляются закрытыми в производном классе программистом

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

2

Другие решения

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

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

3) Тогда присвоение и копирование приведут к ошибке компиляции, как в 1) выше, если не вызвано friend функции или классы, или внутренне в том же классе.

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

3

По вопросам рекламы [email protected]