[fpc-pascal] Turbo Pascal and Object Pascal ways of OOP

Marc Weustink marc at dommelstein.net
Wed Feb 6 00:00:36 CET 2008

Daniël Mantione wrote:
> Op Tue, 5 Feb 2008, schreef Marc Weustink:
>> Daniël Mantione wrote:
>>> Op Tue, 5 Feb 2008, schreef Luiz Americo Pereira Camara:
>>>> can i safely use the below object  instead of the record and pass 
>>>> directly to the c function?
>>>> TMyObj = object
>>>> x: Integer;
>>>> y: Integer;
>>>> Method1;
>>>> Method2;
>>>> end;
>>>> PMyObj = ^TMyObj;
>>> Yes, objects (by specification) are defined to have the same binary 
>>> layout as records.
>>>> Moreover, whats the difference between objects and records with 
>>>> methods (the new Delphi feature)?
>>> Objects can have virtual methods, constructors, destructors. The new 
>>> Delphi feature cannot.
>> however with virtuals or constructors/destructors, the memory layout 
>> is not 100% the same as a record.
> A constructor doesn't add a vmtlink. A virtual method does, and a 
> destructor too because they are virtual. It is never a problem in 
> practise, because you can declare the virtual method in a descendent, i.e.:
> type  Tbinary_compatible_obj=object
>         a,b,c,d,e,f:byte;
>         constructor init;
>       end;
>       Tbinary_compatible_obj_with_vmt=object(Tbinary_compatible_record)
>         constructur init;
>         procedure virtualmethod;virtual;
>         desctructor done;virtual;
>       end;
> In the above example, you can perfectly pass a 
> Tbinary_compatible_obj_with_vmt instance to any C library expecting a 
> Tbinary_compatible_obj, because the vmtlink is located after the fields 
> and therefore does not interfere with the binary structure.

it might be a compiler bug, but when I tried to zeromem a object having 
a constructor it resulted in an IE. Without a constructor not. That way 
I came to a conlusion that an object+constructor is not 100% the same as 
a simple record.


More information about the fpc-pascal mailing list