私有或公开继承自boost :: noncopyable?

时间:2011-04-13 19:13:03

标签: c++ inheritance boost

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

class Foo : public boost::noncopyable {};

VS

class Foo : private boost::noncopyable {};

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

3 个答案:

答案 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)

根据Boost document

  

它旨在用作私人基地。