```
#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
*/
```