prototype in C++

```
#include <string>
#include <list>
#include <iostream>
using namespace std;

class IPerson {
public:
    virtual IPerson* Clone() = 0;
    IPerson(const string& sName, int id):m_sName(sName),m_ID(id) { }
    void Show() { cout<<m_sName<<","<<m_ID<<endl; }
private:
    string m_sName;
    int m_ID;
};
 
class Student: public IPerson {
public:
    Student(const string& sName, int id):IPerson(sName, id) { }
    IPerson* Clone() { return new Student(*this); }
};

class Teacher: public IPerson {
public:
    Teacher(const string& sName, int id):IPerson(sName, id) {  }
    IPerson* Clone() { return new Teacher(*this); }
};
 
class University {
public:
    University() {  }
    University(const University& univ){
        for (auto it = univ.m_Members.begin(); it != univ.m_Members.end(); it++)
            m_Members.push_back((*it)->Clone());
    }
    void Show(){
        for (auto it = m_Members.begin(); it != m_Members.end(); it++)
            (*it)->Show();
    }
    void AddMember( IPerson* ptr) { m_Members.push_back(ptr); }
private:
    list<IPerson*> m_Members;
};

int main() {
    University* pUniversity = new University();
    IPerson* ptr1 = new Student("Messi",1);
    IPerson* ptr2 = new Student("Ronaldo",2);
    IPerson* ptr3 = new Teacher("Scolari",3);
    pUniversity->AddMember(ptr1);
    pUniversity->AddMember(ptr2);
    pUniversity->AddMember(ptr3);
    pUniversity->Show();

    University* pUniversity2 = new University(*pUniversity);
    pUniversity2->Show();
}

/*
Messi,1
Ronaldo,2
Scolari,3
Messi,1
Ronaldo,2
Scolari,3
*/
```