#include <assert.h>
#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

class Subject {
public:
  virtual string Name() = 0;
};

class Calculus : public Subject {
public:
  string Name() { return "Calculus"; }
};

class English : public Subject {
public:
  string Name() { return "English"; }
};

class Algebra : public Subject {
public:
  string Name() { return "Algebra"; }
};

class Cpp : public Subject {
public:
  string Name() { return "C++ Language"; }
};

class Physics : public Subject {
public:
  string Name() { return "Physics"; }
};

void fillObjects(Subject *o[]) {
  o[0] = new Calculus;
  o[1] = new English;
  o[2] = new Algebra;
  o[3] = new Cpp;
  o[4] = new Physics;
}

int main() {
  Subject *o[5];
  fillObjects(o);

  assert(o[0]->Name() == "Calculus");
  assert(o[1]->Name() == "English");
  assert(o[2]->Name() == "Algebra");
  assert(o[3]->Name() == "C++ Language");
  assert(o[4]->Name() == "Physics");
  cout << "pass!!!" << endl;
  for (int i = 0; i < 5; i++)
    delete o[i];
  return 0;
}