// virtual functions

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

class Person {
public:
    Person(const string &_name, int _id) :
        name(_name), id(_id) {
    }

    virtual ~Person() {}

    int getID() const {
        return id;
    }

    virtual string toString() const {
        ostringstream oss;
        oss << name << ", " << getID();
        return oss.str();
    }

private:
    string name;
    int id;
};

class Student : public Person {
public:
    Student(const string &_name, int _id, int _course) :
        Person(_name, _id), course(_course) {}

    int getCourse() const {
        return course;
    }

    string toString() const {
        ostringstream oss;
        oss << Person::toString() << ", Course " << course;
        return oss.str();
    }

private:
    int course;
};

void printInfo(const Person &p);

int main() {
    Person p("Susan Hockfield", 1);
    Student s("Katherine Lai", 2, 6);
    printInfo(s);
}

void printInfo(const Person &p) {
    cout << p.toString() << endl;
}
