Most of the methods are virtual, even in the cases where it's not quite clear whether it is really nessessary. Because, as a rule, it happens that in some cases one finds that the only way to fix certain problem is by overriding "dumb" implementation of the base class, and it makes matters worth if that dumb imp. is even made *non-virtual*. It is also healthier for plugins, their binary compatiblity and freedom to override whenever is needed, without asking core-developers about to adding "virtual" keywords here and there. The sure downside is that you cannot know whether it is good to override the method you see, but this is cured by *explicitely* adding comments to decls. of methods which are meant for overriding, and describe why/when it makes sense.
Overridable methods are prefixed with "On" if they indicate an action/notification overriding of which is optional, where as those which must be overriden are not prefixed (in the future they will be made pure virtual " = 0"), and commented urging about such need. Btw, the weird reason that "=0" is not used in current sources, is that it's inconvenient for cut-&-pasting decls. into the derived class - always having/forgetting to cut off =0's (+linking errs) is annoying... ;-)