Development C++

#include 
#include 
using namespace std;
class two_d_shape {
protected:
  double x, y;
public:
  two_d_shape(double i, double j) {
    x = i;
    y = j;
  }
  double getx() { return x; }
  double gety() { return y; }
  virtual double area() = 0;
};
// Create a subclass of two_d_shape for triangles.
class triangle : public two_d_shape {
  public:
    triangle(double i, double j) : two_d_shape(i, j) { }
    double area() {
      return x * 0.5 * y;
    }
};
// Create a subclass of two_d_shape for rectangles.
class rectangle : public two_d_shape {
  public:
    rectangle(double i, double j) : two_d_shape(i, j) { }
    double area() {
      return x * y;
    }
};
// Create a subclass of two_d_shape for circles.
class circle : public two_d_shape {
  public:
    circle(double i, double j=0) : two_d_shape(i, j) { }
    double area() {
      return 3.14 * x * x;
    }
};
// A factory for objects derived from two_d_shape.
two_d_shape *factory() {
  static double i = (rand() % 100) / 3.0, j = (rand() % 100) / 3.0;
  i += rand() % 10;
  j += rand() % 12;
  cout << "Generating object.\n";
  switch(rand() % 3 ) {
    case 0: return new circle(i);
    case 1: return new triangle(i, j);
    case 2: return new rectangle(i, j);
}
  return 0;
}
// Compare two shapes for equality. This means that their
// types and dimensions must be the same.
bool sameshape(two_d_shape *alpha, two_d_shape *beta) {
  cout << "Comparing a " << typeid(*alpha).name()
       << " object to a " << typeid(*beta).name()
       << " object\n";
  if(typeid(*alpha) != typeid(*beta)) return false;
  if(alpha->getx() != beta->getx() &&
     alpha->gety() != beta->gety()) return false;
  return true;
}
int main()
{
  // Create a base class pointer to two_d_shape.
  two_d_shape *p;
  // Generate two_d_shape objects.
  for(int i=0; i < 6; i++) {
    // Generate an object.
    p = factory();
    // Display the name of the object.
    cout << "Object is " << typeid(*p).name() << endl;
    // Display its area.
    cout << "    Area is " << p->area() << endl;
    // Keep a count of the object types that have been generated.
    if(typeid(*p) == typeid(triangle))
      cout << "    Base is " << p->getx() << " Height is "
           << p->gety() << endl;
    else if(typeid(*p) == typeid(rectangle))
      cout << "    Length is " << p->getx() << " Height is "
           << p->gety() << endl;
    else if(typeid(*p) == typeid(circle))
      cout << "    Diameter is " << p->getx() << endl;
    cout << endl;
  }
  cout << endl;
  // Make some objects to compare.
  triangle t(2, 3);
  triangle t2(2, 3);
  triangle t3(3, 2);
  rectangle r(2, 3);
  // Compare two two_d_objects.
  if(sameshape(&t, &t2))
    cout << "t and t2 are the same.\n";
  if(!sameshape(&t, &t3))
    cout << "t and t3 differ.\n";
  if(!sameshape(&t, &r))
    cout << "t and r differ.\n";
  cout << endl;
  return 0;
}