/********************************************************************** * virtual.cc * Tom Kelliher * * This program demonstrates several advanced features of classes: * o Public inheritance and the IS-A relationship. * o Static re-definition of class methods. * o Virtual functions and run-time re-definition of class methods. * (Polymorphism) ("Turn the way you want to turn.") **********************************************************************/ #include /********************************************************************** * class base **********************************************************************/ class base { public: // Compile-time binding. void print1(void) { cout << "print1() of base class\n"; } // Run-time binding. virtual void print2(void) { cout << "print2() of base class\n"; } // Demonstrate "default" method feature of a base class. virtual void print3(void) { cout << "print3() of base class\n"; } }; /********************************************************************** * class derived1 **********************************************************************/ class derived1 : public base // derived1 IS-A base. // Try AS-A inheritance. { public: void print1(void) { cout << "print1() of derived1 class\n"; } void print2(void) { cout << "print2() of derived1 class\n"; } // Note lack of re-definition of print3(). }; /********************************************************************** * class derived2 **********************************************************************/ class derived2 : public base // derived2 IS-A base. { public: void print1(void) { cout << "print1() of derived2 class\n"; } void print2(void) { cout << "print2() of derived2 class\n"; } void print3(void) { cout << "print3() of derived2 class\n"; } }; /********************************************************************** * main() **********************************************************************/ int main() { base b; base *p = &b; derived1 d1; // Question: can q point to b or d2? derived1 *q = &d1; derived2 d2; cout << "The \"normal\" calls:\n"; b.print1(); b.print2(); b.print3(); d1.print1(); d1.print2(); d1.print3(); d2.print1(); d2.print2(); d2.print3(); cout << "\nWorking on instance b of base class through base*:\n"; p->print1(); p->print2(); p->print3(); cout << "\nWorking on instance d1 of derived1 class through base*:\n"; p = &d1; p->print1(); // Can I "fix" things this way? // p->derived1::print1(); p->print2(); p->print3(); cout << "\nWorking on instance d1 of derived1 class through derived1*:\n"; q->print1(); q->print2(); q->print3(); // Will these work? // q = &b; // q = &d2; cout << "\nWorking on instance d2 of derived2 class through base*:\n"; p = &d2; p->print1(); p->print2(); p->print3(); return 0; }