Methods can be either static or virtual. Calls to static methods are resolved
at compilation. Calls to virtual methods are resolved at run time with delayed
or late binding. By default the methods are static; virtual methods contain
a special keyword virtual as part of their declaration. Static methods
can be overridden without restrictions. However, virtual method override must
be done by a method that uses exactly the same syntax, e.g. has the same number
and types of the arguments. Objects that contain virtual methods require
building a special jump table, called the Virtual Method Table
(VMT).
The VMT is created during the initialization of the object through a
constructor call.