Points to note:
Any method that is declared virtual is dynamically bound (run-time).
Any other method is statically bound (compile-time).
Any method once declared virtual, remains virtual for all the levels of inheritance below regardless of whether or not it is declared virtual in the classes below. i.e. Suppose the hierarchy is this: Man->Indian->Tamilian.
If do_work() is a virtual method, then it remains virtual even for Tamilian, even if it is declared as virtual only in Man.
How does the virtual keyword work?
Declaring do_work() as virtual simply means: which do_work() to call will be determined ONLY at run-time.
Suppose I do,
Man *man;
man = new Indian();
man->do_work(); // Indian's do work is only called.
If virtual is not used, the same is statically determined or statically bound by the compiler, depending on what object is calling. So if an object of Man calls do_work(), Man's do_work() is called EVEN THOUGH IT POINTS TO AN INDIAN OBJECT
To my astonishment I discovered that purely virtual functions can also have a body! I thought they can't. But, the truth is that they can. Which means an abstract class' pure virtual function can be called!!! Two very good authors are Bjarne Stroustrup and Stan Lippman.... because they wrote the language.