[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.
Marc
More information about the fpc-pascal
mailing list