您会推荐哪种做法?为什么?
class Foo : public boost::noncopyable {};
VS
class Foo : private boost::noncopyable {};
我无法想象需要使用Foo的实例作为boost :: noncopyable,所以在这种情况下我倾向于私有继承。
答案 0 :(得分:25)
boost::noncopyable
没有声明virtual
析构函数,即不是公共继承链的基础。始终从私下继承。
答案 1 :(得分:3)
我认为从更高的角度来看,它应该是public
继承。成为private
的原因纯粹是技术性的。
为什么呢?因为类型是否可复制(并且通过继承自boost::noncopyable
显示)是 public 接口的一部分。例如,如果继承是public
,您将能够检查(使用"元编程")类型是否从boost::noncopyable
派生,然后判断它是否可复制。
Nikolai N Fetissov in his answer to this question指出boost::noncopyable
没有virtual
析构函数,所以不应该用作public
基类。虽然它一般来说它是一个有效的参数,但我认为任何人都不可能尝试通过指向delete
的指针来使用(并且特别是boost::noncopyable
一个对象,它会产生参数(在此特殊情况)纯粹是学术性的。
来吧!如果某人倾向于滥用代码,他会在指向delete
的指针上使用boost::noncopyable
,那么就没有办法保证安全。当然你可以让它变得更难,但是如此坚定的程序员会找到其他方法来滥用代码。
似乎在C ++ 11中boost::noncopyable
可以通过声明default
protected
析构函数来解决该问题:
protected:
~noncopyable() = default;
这样,在我们受到default
指针delete
的{{1}}保护时,应该没有额外的声明析构函数的成本(因为我们创建了boost::noncopyable
)。
另一方面,似乎不太可能有人愿意通过检查来自boost::noncopyable
的继承来检查类型是否可复制。主要是因为它没有提供完整的答案。仅仅因为类型不是来自boost::noncopyable
,它并不意味着它是可复制的。
另请注意,Boost.Noncopyable docs建议使用private
继承。
答案 2 :(得分:2)
它旨在用作私人基地。