// demo of polymorphism, and the "slicing problem" #include using namespace std; class Person { public: Person(string); virtual void print() const; virtual ~Person() { } protected: string name; }; class Instructor : public Person { public: Instructor(string, string); virtual void print() const; virtual ~Instructor() { } private: string course; }; Person::Person(string n) : name(n) { } Instructor::Instructor(string n, string c) : Person(n), course(c) { } void Person::print() const { cout << name << ": Person" << endl; } void Instructor::print() const { cout << name << ": Instructor of " << course << endl; } // first function has base class reference parameter void func1(Person &p) { cout << "func1 - "; p.print(); } // second function has base class pointer parameter void func2(Person *p) { cout << "func2 - "; p->print(); } // third function has base class object parameter void func3(Person p) { cout << "func3 - "; p.print(); } int main() { Instructor me("Mike", "CS 32"); func1(me); func2(&me); func3(me); }