【问题标题】:privately or publicly inherit from boost::non_copyable?从 boost::non_copyable 私下或公开继承?
【发布时间】:2011-04-13 19:13:03
【问题描述】:

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

class Foo : public boost::noncopyable {};

对比

class Foo : private boost::noncopyable {};

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

【问题讨论】:

  • 我总是这样做:class Foo: boost::noncopyable :)

标签: c++ inheritance boost


【解决方案1】:

boost::noncopyable 没有声明virtual 析构函数,即不是设计为公共继承链的基础。始终私下继承它。

【讨论】:

    【解决方案2】:

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

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

    Nikolai N Fetissov in his answer to this question 指出 boost::noncopyable 没有 virtual 析构函数,因此不应用作 public 基类。虽然它通常是一个有效的论点,但我认为任何人都不太可能尝试通过指向boost::noncopyable 的指针来使用(尤其是delete)一个对象,以至于它纯粹地提出论点(在这种特殊情况下)学术。

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

    似乎在 C++11 中 boost::noncopyable 可以通过声明 default protected 析构函数来解决该问题:

    protected:
        ~noncopyable() = default;
    

    这样,在指向boost::noncopyable 的指针上受到delete 的保护时,声明析构函数(因为我们将其设为default)应该没有额外的成本。

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

    还要注意Boost.Noncopyable docs 建议使用private 继承。

    【讨论】:

      【解决方案3】:

      根据Boost document

      它旨在用作私人基地。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 2011-08-10
        相关资源
        最近更新 更多