【问题标题】:Prohibiting definition of a copy constructor in an inherited class禁止在继承类中定义复制构造函数
【发布时间】:2013-03-06 17:31:45
【问题描述】:

我想让一个抽象基类不可复制,并强制从它派生的任何类不可复制。下面的代码使用了 noncopyable.hpp 中定义的 Boost 的不可复制,但仍然允许派生类 D 定义复制构造函数。

class noncopyable
{
    protected:
        noncopyable() {}
        ~noncopyable() {}
    private:  // emphasize the following members are private
        noncopyable( const noncopyable& );
        const noncopyable& operator=( const noncopyable& );
};

class D : noncopyable
{
    public:
        D() { }
        D(const D&) { }
};

int main()
{
    D a;
    D b(a);

    return 0;
}

此代码编译并运行 (http://ideone.com/g4gGLm),但我预计它会引发关于 D 的复制构造函数的编译时错误。也许我误解了这个不可复制的类的目的。如果是这样,有没有办法强制派生类不定义复制构造函数? (答案可以用C++11,但最好不要boost)

【问题讨论】:

    标签: c++ copy-constructor noncopyable


    【解决方案1】:

    之所以如此,是因为D(const D&) 调用了基类的默认构造函数,而不是复制构造函数。 (起初违反直觉,但考虑到所有构造函数的行为都是这样的,这是有道理的)

    由于未调用复制构造函数,因此除非您明确要求,否则不会创建基础对象的副本:

    D(const D& d) : noncopyable(d) { }
    

    这确实会导致错误。所以事实上,你的问题不是问题——没有复制noncopyable

    我不知道有任何直接的方法可以强制派生类不允许复制,如果有的话,我也不建议使用。

    【讨论】:

    • 为什么不建议禁止复制?
    • @steve9164 并不是这么说的——我不建议仅仅为了强制派生类禁止复制而编写不可读的代码。
    • 如果生成的代码不可读,那么是的,我同意这可能不值得
    • 你的回答很好,但 NonNumeric 也展示了不可复制有用的代码示例,因此我接受了他的回答
    • @steve9164 无论如何,接受您认为最有用的答案。无需证明您的选择是合理的。但我很高兴我提供了帮助。
    【解决方案2】:

    您需要删除 D 的复制构造函数。现在您通过不尝试复制构造基类来允许 D 的复制构造。以下变体将无法编译:

    class E: noncopyable
    {
    };
    E e, e2(e);
    
    class F: noncopyable
    {
    public:
      F(const F &init): noncopyable(init)
      {}
    };
    

    【讨论】:

    • 我现在明白了 noncopyable 的用途(感谢您的 E 类示例)。谢谢
    猜你喜欢
    • 2011-11-25
    • 2015-10-07
    • 1970-01-01
    • 2012-05-26
    • 2019-01-12
    • 2021-11-20
    • 2015-04-11
    相关资源
    最近更新 更多