我想使一个抽象基类不可复制,并强制从它派生的任何类都是不可复制的。下面的代码使用了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,但最好不要提升)
答案 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)
{}
};