10

我想让一个抽象基类不可复制,并强制从它派生的任何类不可复制。下面的代码使用了在 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,但最好不要boost)

4

2 回答 2

13

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

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

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

这确实会导致错误。所以事实上,你的问题是一个非问题 - 没有noncopyable继续进行的复制。

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

于 2013-03-18T11:39:44.410 回答
3

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

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

class F: noncopyable
{
public:
  F(const F &init): noncopyable(init)
  {}
};
于 2013-03-18T11:44:15.827 回答