
           VIRTUAL METHODS AND THE VIRTUAL METHOD TABLE. 
           

 Every object type, that contains or inherits a virtual method, has a
 Virtual Method Table (VMT) in the data segment.  The VMT contains the size
 of the object type and a set of pointers to the code for each of its
 virtual methods. 

 For each instance of an object type, the CONSTRUCTOR establishes a link
 between that instance and the VMT for that object type. This link is a
 16-bit field, called the virtual method table field, which follows the
 ordinary data fields in the object type. 

 There is only one VMT for each object type.  Individual instances of an
 object type contain a link to the VMT - they do not contain the VMT itself. 

 Example: 

 type
   Location = object
     X, Y: Integer;
     procedure Init(NewX, NewY: Integer);
     function GetX: Integer;
     function GetY: Integer;
   end;

   PointPtr = ^Point;
   Point = object(Location);
     Color: Integer;
     constructor Init(NewX, NewY, NewColor: Integer);
     destructor Done; virtual;
     procedure Show; virtual;
     procedure Hide; virtual;
     procedure MoveTo(NewX, NewY: Integer); virtual;
   end;

   CirclePtr = ^Circle;
   Circle = object(Point);
     Radius: Integer;
     constructor Init(NewX, NewY, NewColor, NewRadius: Integer);
     procedure Show; virtual;
     procedure Hide; virtual;
     procedure Fill: virtual;
   end;


 Instances of types Location, Point and Circle are shown below:

        Location                Point                Circle 

    -----------------      -----------------     ----------------- 
    | X             |      | X             |     | X             | 
    -----------------      -----------------     ----------------- 
    | Y             |      | Y             |     | Y             | 
    -----------------      -----------------     ----------------- 
                           | Color         |     | Color         | 
                           -----------------     ----------------- 
                           | VMT           |     | VMT           | 
                           -----------------     ----------------- 
                                                 | Radius        | 
                                                 ----------------- 

 Because Point is the first type in the hierarchy that introduces virtual
 methods, the VMT field is allocated immediately after the Color field.

 VMTs are built automatically by the compiler and are never directly
 manipulated by a program.  Likewise, pointers to VMTs are automatically
 stored in object type instances by the object type's constructors and are
 never directly manipulated by the program. 

 The layouts of the VMTs for point and circle types are shown below: 

         Point VMT                     Circle VMT 
    --------------------       ---------------------  ---------------------
    | $0008            |       | $000A             |     Size
    --------------------       ---------------------  ---------------------
    | $FFF8            |       | $FFF6             |  Negative size (check)
    --------------------       ---------------------  ---------------------
    | @Point.Done      |       | @Point.Done       |  Seg:Ofs addresses of
    --------------------       ---------------------
    | @Point.Show      |       | @Circle.Show      |  methods, inherited
    --------------------       ---------------------
    | @Point.Hide      |       | @Circle.Hide      |  like Done and MoveTo
    --------------------       ---------------------
    | @Point.MoveTo    |       | @Point.MoveTo     |  or overridden like
    --------------------       ---------------------
                               | @Circle.Fill      |  Show and Hide.
                               ---------------------  ---------------------

 Circle inherits Done and MoveTo methods from Point, but overrides Show and
 Hide methods and has its own new method Fill.


 VMT.TXT 
 22.8.92 
 1.6.93
