Запрещение определения конструктора копирования в унаследованном классе

Я хочу сделать абстрактный базовый класс не подлежащим копированию и заставить все классы, производные от него, быть не копируемыми. В приведенном ниже коде используется не копируемый Boost, как определено в noncopyable.hpp все еще позволяет 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, но желательно не повысить)

9

Решение

Вам нужно удалить конструктор копирования D. Прямо сейчас вы разрешаете копирование D, не пытаясь копировать базовый класс. Следующие варианты не будут компилироваться:

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

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

Другие решения

Это работает потому, что D(const D&) вызывает конструктор по умолчанию базового класса, а не конструктор копирования. (сначала нелогично, но это имеет смысл, учитывая, что все конструкторы ведут себя так)

Поскольку конструктор копирования не вызывается, копия базового объекта не создается, если вы явно не запросите один:

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

что действительно приведет к ошибке. Таким образом, на самом деле, ваша проблема не является проблемой — нет копирования noncopyable продолжается.

Я не знаю ни одного прямого способа заставить производный класс запретить копирование, и я бы не рекомендовал использовать его, если он был.

12

По вопросам рекламы [email protected]