The solution is that every object contains an extra hidden data field.
This data field points to an array of pointers to functions.
The array is determined by the current dynamic type, and is shared
by all instances of the class.
The offset of each method can be determined at compile time.