Подтвердить что ты не робот

Конфиденциально или публично наследовать от boost:: non_copyable?

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

class Foo : public boost::noncopyable {};

против.

class Foo : private boost::noncopyable {};

Я не могу себе представить, что нужно использовать экземпляр Foo как boost:: noncopyable, поэтому в этом случае я склоняюсь к частному наследованию.

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

В соответствии с Boost document

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