community.borland.com

Article #15436: CONSTRUCTOR CALL WITHIN METHOD

 Technical Notes Database

TN436D.txt   CONSTRUCTOR CALL WITHIN METHOD
Category   :Pascal
Platform    :All
Product    :Turbo Pascal  5.5

Description:
Q. I am calling my constructor from within a method, why am I
   having problems?
A. The problem will arise when the constructor loads the new VMT
   pointer. It loads the pointer to the VMT for the constructor's
   table, not the instances. Therefore if a descendant calls an
   ancestor's constructor, the descendant's VMT will now point to
   the ancestors VMT. The problem now occurs when the descendant
   tries to call a method that was defined after the ancestor.
   The VMT entry for this method is unknown. Look at the
   following example:

     Type
       L1 = Object
              Constructor Init;
              Procedure First; Virtual;
       End;
       L2 = Object ( L1 );
              Constructor Init;
              Procedure Second; Virtual;
       End;

     Constructor L1.Init;
     Begin
     End;

     Constructor L2.Init;
     Begin
     End;

     Procedure L1.First;
     Begin
       Init;
     End;

     Procedure L2.Second;
     Begin
       Init;
     End;

     Var
       L : L2;

     Begin
       L.Init;   { This calls L2.Init and loads a pointer to }
                 { the L2 VMT into L.                        }
       L.First;  { This will call L1.First, which in turn calls }
                 { L1.Init because as far as the procedure is   }
                 { concerned, the Self pointer is a pointer     }
                 { to an object of type L1.                     }
       L.Second; { This is undefined. Since the VMT now       }
                 { pointed to by L is L1's, the pointer to    }
                 { method Second is undefined. Therefore, the }
                 { call to this method is undefined.          }
       ...

 ***Note: This also applies to polymorphic procedures.


Reference:


7/16/98 4:35:32 PM
 

Last Modified: 01-SEP-99