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