private或public继承自boost::non_copyable

privately or publicly inherit from boost::non_copyable?

本文关键字:non copyable boost public 继承 private      更新时间:2023-10-16

您会推荐哪种做法,为什么?

class Foo : public boost::noncopyable {};

class Foo : private boost::noncopyable {};

我无法想象需要使用Foo的实例作为boost::noncopyable,所以在这种情况下我倾向于私有继承。

boost::noncopyable没有声明virtual析构函数,即不被设计为公共继承链的基础。

我认为从更高的角度来看应该是public继承。使其成为private的原因纯粹是技术上的。

为什么?因为类型是否可复制(这是通过继承boost::noncopyable显示的)是public接口的一部分。例如,如果继承是public,您将能够检查(使用"元编程")类型是否派生自boost::noncopyable,然后推断它是否可复制。

Nikolai N Fetissov在回答这个问题时指出,boost::noncopyable没有virtual析构函数,因此不应该用作public基类。虽然一般来说这是一个有效的参数,但我认为任何人都不太可能尝试通过指向boost::noncopyable的指针来使用对象(特别是delete),这使得该参数(在这种特殊情况下)纯粹是学术性的。

来吧!如果有人是如此倾向于滥用代码,他使用delete指针到boost::noncopyable,那么没有办法是安全的。当然,你可以让它更难一点,但一个如此坚定的程序员无论如何都会找到其他方法来误用代码。

似乎在c++ 11中boost::noncopyable可以通过声明default protected destructor来解决这个问题:

protected:
    ~noncopyable() = default;

这样就不会有声明析构函数的额外开销(因为我们把它改成了default),同时在指向boost::noncopyable的指针上保护我们不受delete的影响。

然而,另一方面,似乎也不太可能有人愿意通过检查boost::noncopyable的继承来检查类型是否可复制。主要是因为它不能提供完整的答案。仅仅因为一个类型不是来自boost::noncopyable,并不意味着它是可复制的。

还要注意Boost。不可复制文档建议使用private继承

根据Boost文档

用作私有基。