// Dr. Ismail Toroslu // 2/27/02 // Each of these small examples illustrates the subtlties of virtual // functions. #include class A { public: void f() {cout<< 'a';}; }; class B:public A { public: void f() {cout<< 'b';}; }; // if not pointer the virtual does not work void test(A *ta) { ta->f();} main(){ A a; test(&a); B b; test(&b); } // output aa ///////////////////////////////////////////////////////////////////////// #include class A { public: virtual void f() {cout<< 'a';}; }; class B:public A{ public: void f() {cout<< 'b';}; }; void test(A *ta) { ta->f();} main(){ A a; test(&a); B b; test(&b); } // output ab ////////////////////////////////////////////////////////////////////////// #include class B{public:virtual void f(){cout<<'B';};}; class D:public B{public: void f(){cout<<'D';};}; main(){ D d; d.B::f(); B *bp = &d; bp->f(); bp->B::f();} // output BDB //////////////////////////////////////////////////////////////////////// #include class B {public: void f() {cout <<'B';};}; class D:public B {public : void f() {cout <<'D'; };}; main() { D d; B *bp = &d; bp->f(); d.f(); } // output BD ////////////////////////////////////////////////////////////////////////// #include class B {public: void f() {cout <<'B';};}; // f cannot be virtual, type conflict class D:public B {public : char f() {cout <<'D'; return 'D';};}; main() { D d; B *bp = &d; bp->f(); d.f(); } //output BD ///////////////////////////////////////////////////////////////////////// #include class B {public: virtual void f() {cout <<'B';};}; class D:public B {public : void f() {cout <<'D'; };}; main() { D d; B *bp = &d; bp->f(); d.f(); } // output DD