Я думаю, что с более высокой точки зрения это должно быть public
наследование. Причины сделать это private
чисто техническими.
Почему? Потому что, является ли тип копируемым или нет (и это показано наследованием от boost::noncopyable
), является частью интерфейса public . Например, если наследование будет public
, вы сможете проверить (используя «метапрограммирование»), является ли тип производным от boost::noncopyable
, а затем определить, можно ли его копировать или нет.
Николай Н Фетиссов в своем ответе на этот вопрос указывает, что boost::noncopyable
не имеет деструктора virtual
и поэтому не должен использоваться в качестве public
базового класса. Несмотря на то, что это действительный аргумент в целом, я думаю, что маловероятно, чтобы кто-либо когда-либо пытался использовать (и delete
в частности) объект с указателем на boost::noncopyable
, что он делает аргумент (в данном конкретном случае) чисто академично.
Давай! Если кто-то настолько склонен к неправильному использованию кода, что использует delete
для указателя на boost::noncopyable
, то не существует способа быть в безопасности. Конечно, вы можете сделать это немного сложнее, но программист с такой решимостью все равно найдет другой способ неправильного использования кода.
Также кажется, что в C ++ 11 boost::noncopyable
может решить эту проблему, объявив деструктор default
protected
:
protected:
~noncopyable() = default;
Таким образом, не должно быть никаких дополнительных затрат на объявление деструктора (поскольку мы сделали его default
), пока мы защищены от delete
по указателю на boost::noncopyable
.
С другой стороны, также маловероятно, что кто-либо захочет проверить, можно ли копировать тип, проверив наследование из boost::noncopyable
. Главным образом потому, что он не дает полного ответа. Тот факт, что тип не является производным от boost::noncopyable
, не означает, что его можно копировать.
Обратите внимание, что Boost.Некопируемые документы предполагают использование private
наследования.