Сделав конструктор копирования закрытым, вы поможете предотвратить случайное срезание объектов, когда вы создаете копию производного класса, но теряете все свойства этого производного класса. Производные классы могут создавать свои собственные конструкторы копирования, которые являются общедоступными и делают правильные вещи.
В одном случае конструктор копирования должен быть защищен, а не закрытым, когда у абстрактного класса есть члены-данные. Это случается не очень часто. Базовый класс может копировать члены базового класса, в то время как производный класс копирует своих собственных членов.
class AbstractBase
{
public:
AbstractBase(const std::string &init) : wtf(init) {}
virtual ~AbstractBase() {}
void DoSomething() = 0;
protected:
AbstractBase(const AbstractBase &r) : wtf(r.wtf) {}
const std::string wtf;
};
class Derived : public AbstractBase
{
public:
// ...
Derived(const Derived &r) : AbstractBase(r), moredata(r.moredata) {}
private:
int moredata;
};