// constructores-v.cpp
#include <iostream>
using namespace std;

//////////////////////////////////////////////////////////////////
class CB
{
  private:
    int i;
  public:
    // Constructor por omisión
    CB() { cout << "constructor CB\n"; }
    virtual ~CB() { cout << "destructor CB\n"; }
    // ...
    virtual CB *nuevo() { return new CB; }
    virtual CB *clonar() { return new CB(*this); }
};

class CD : public CB
{
  private:
    double d;
  public:
    // Constructor por omisión
    CD() { cout << "constructor CD\n"; }
    ~CD() { cout << "destructor CD\n"; }
    // ...
    CD *nuevo() { return new CD; }
    CD *clonar() { return new CD(*this); }
};
//////////////////////////////////////////////////////////////////

CB *crearObjeto(CB *p) // función global
{
  return p->nuevo();
}

int main()
{
  CB obj_cb, *cb = &obj_cb;
  CD obj_cd, *cd = &obj_cd;

  CB *p1 = crearObjeto(cb); // crea un objeto de tipo CB
  CB *p2 = crearObjeto(cd); // crea un objeto de tipo CD

  CB *p3 = p1->clonar();
  CB *p4 = p2->clonar();
  
  // ...
  // Liberar memoria
  delete p1;
  delete p2;
  delete p3;
  delete p4;
}

