C++ 禁止在继承类中定义复制构造函数
我想使抽象基类不可复制,并强制从它派生的任何类不可复制。下面的代码使用Boost的noncopyable(如中所定义),但仍然允许D(派生类)定义复制构造函数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
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类示例)。谢谢