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

C++ 禁止在继承类中定义复制构造函数,c++,copy-constructor,noncopyable,C++,Copy Constructor,Noncopyable,我想使抽象基类不可复制,并强制从它派生的任何类不可复制。下面的代码使用Boost的noncopyable(如中所定义),但仍然允许D(派生类)定义复制构造函数 class noncopyable { protected: noncopyable() {} ~noncopyable() {} private: // emphasize the following members are private noncopyable( co

我想使抽象基类不可复制,并强制从它派生的任何类不可复制。下面的代码使用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;
}

这段代码编译并运行(),我希望它会抛出一个关于D的复制构造函数的编译时错误。也许我误解了这个不可复制类的作用。如果是这样,有没有办法强制派生类不定义复制构造函数?(答案可以使用C++11,但最好不要使用boost)

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

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

D(const D& d) : noncopyable(d) { }
这确实会导致错误。因此,事实上,您的问题是一个非问题-没有复制
noncopyable


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

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

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

class F: noncopyable
{
public:
  F(const F &init): noncopyable(init)
  {}
};

为什么你不建议不允许复制?@steve9164并没有这么说-我不建议仅仅为了强制派生类不允许复制而编写不可读的代码。如果生成的代码不可读,那么是的,我同意这可能不值得。你的答案很好,但NonNumeric也显示了noncopyable有用的代码示例,因此我接受了他的answer@steve9164无论如何,接受你认为最有用的答案。没有必要证明你的选择是正确的。但我很高兴我帮了忙。我现在明白了什么是不可复制的(感谢你的E类示例)。谢谢