приватно или публично наследовать от boost :: non_copyable? - PullRequest
21 голосов
/ 13 апреля 2011

Какую практику вы бы порекомендовали и почему?

class Foo : public boost::noncopyable {};

против

class Foo : private boost::noncopyable {};

Я не могу представить необходимость использования экземпляра Foo в качестве повышения:в этом случае я склоняюсь к частному наследованию.

Ответы [ 3 ]

26 голосов
/ 13 апреля 2011

boost::noncopyable не объявляет деструктор virtual, т. Е. Не предназначен для использования в качестве основы публичной цепочки наследования.Всегда наследуй от него в частном порядке .

3 голосов
/ 06 ноября 2014

Я думаю, что с более высокой точки зрения это должно быть 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 наследования.

2 голосов
/ 20 марта 2017

Согласно документу Boost

Он предназначен для использования в качестве частной базы.

...