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

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

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[]) {
    //fill Calculus, English, Algebra, C++ Language, Physics
    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;
}