禁止在继承的类中定义复制构造函数

时间:2013-03-18 11:34:17

标签: c++ copy-constructor noncopyable

我想使一个抽象基类不可复制,并强制从它派生的任何类都是不可复制的。下面的代码使用了noncopyable.hpp中定义的Boost的noncopyable,但仍允许派生类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,但最好不要提升)

2 个答案:

答案 0 :(得分:13)

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

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

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

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

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

答案 1 :(得分:3)

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

class E: noncopyable
{
};
E e, e2(e);

class F: noncopyable
{
public:
  F(const F &init): noncopyable(init)
  {}
};
相关问题