/* An example of a non-abstract virtual function*/ #include using namespace std; class Base { public: virtual void f(){ cout <<"Base::f() -- I am *not* abstract\n"; } void g(){ cout <<"Base::g() -- I am *not* virtual\n"; } }; class Derived:public Base{ public: void f(){ cout <<"Derived::f() -- I override a virtual Base::f()\n";} void g(){ cout <<"Derived::g() -- I override a non-virtual Base::g()\n";} }; int main() { Base b; cout << "Call using Base object b.f())\n"; b.f(); cout << "Call using Base object b.g())\n"; b.g(); Derived d; cout << "Call using Derived object d.f()\n"; d.f(); cout << "Call using Derived object d.g()\n"; d.g(); Base * p; cout <<"\n p = &b; \n"; p=&b; cout << "Call using reference to Base object p->f()\n"; p->f(); cout << "Call using reference to Base object p->g()\n"; p->g(); cout << "\n p=&d \n"; p=&d; cout << "Call using reference to Derived object p->f()\n"; p->f(); cout << "Call using reference to Derived object p->g()\n"; p->g(); cout << "\nNow copy Derived d into Base b\n"; cout << "\nb=d;\n"; b=d; cout << "Call using Base object b.f())\n"; b.f(); cout << "Call using Base object b.g())\n"; b.g(); }