constructeur de copie est implicitement supprimé parce que la définition par défaut serait mal formé

J'ai une classe A (à partir d'une bibliothèque sur laquelle je n'ai aucun contrôle) avec un constructeur de copie et un clone méthode, et une classe B dérivé de A. Je tiens à mettre en œuvre clone pour B ainsi.

L'approche naïve

#include <memory>

class A { //I have no control here
  public:
    A(int a) {};

    std::shared_ptr<A>
      clone() const
      {
        return std::shared_ptr<A>(new A(*this));
      }

  private:
    A(const A & a) {};
};

class B: public A {
  public:
    B(int data, int extraData):
      A(data),
      extraData_(extraData)
    {
    }

    std::shared_ptr<B>
    clone() const
    {
      return std::shared_ptr<B>(new B(*this));
    }

  private:
    int extraData_;
};

int main() {
  A a(1);
}

cependant, ne parvient pas, depuis le constructeur de copie de A est privé:

main.cpp: In member function std::shared_ptr<B> B::clone() const’:
main.cpp:27:42: error: use of deleted function B::B(const B&)’
     return std::shared_ptr<B>(new B(*this));
                                      ^
main.cpp:17:7: note: B::B(const B&)’ is implicitly deleted because the default definition would be ill-formed:
 class B: public A {
       ^
main.cpp:14:5: error: A::A(const A&)’ is private
     A(const A & a) {};
     ^
main.cpp:17:7: error: within this context
 class B: public A {

Il pourrait y un moyen de rendre l'utilisation de A::clone() pour B::clone(), mais je ne suis pas sûr de savoir comment cela fonctionnerait exactement. Un indice?