DISPATCHING RULES

(This is all static dispatching, except in case 2.b.ii, 
where noted otherwise.)

............................................................
case 1:  call on an instance (but *not* a reference)
         e.g. theInstance.method(...);

  a.  What is theInstance's type?

  b.  Execute that class' method.

............................................................
case 2:  call using a pointer or reference
         e.g. theInstancePtr->method(...);
         e.g. theReference.method(...);

  a.  What is theInstancePtr's type?  
      (must be some class pointer type)

  b.  Is this method declared virtual in this class
      or a base class of this class?

      i.   If not, execute the method in the class
           matching the theInstancePtr's type.

      ii.  If so, it's DYNAMIC DISPATCHING time:
           
           What is the (dynamic) type of the object that
           theInstancePtr points to?

           Execute that class' method.

  (analogous procedure for references...)

  a.  What is theReference's declared (static) type?  
      (must be some class type)

  b.  Is this method declared virtual in this class
      or a base class of this class?

      i.   If not, execute the method in the class
           matching theReference's static type.

      ii.  If so, it's DYNAMIC DISPATCHING time:
           
           What is the (dynamic) type of the object for
           which theReference is an alias?

           Execute that class' method.