On 17/04/2010 00:29, Marc Weustink wrote:
Flávio Etrusco wrote:
On Fri, Apr 16, 2010 at 4:54 PM, José Mejuto <joshy...@gmail.com> wrote:
Hello FPC-Pascal,
Friday, April 16, 2010, 9:06:45 PM, you wrote:
FE> Published methods can be found with TObject.MethodAddress,
that's how
FE> the lfm hook event handlers (and why Form event handlers are
FE> published).
Yes, but thats for streamable objects like TForm, or any component,
but I think that that's not the case of TWSxxxx objects which are the
widgetset interface, and also all of them are "class procedure".
Marc says in Lazarus that a "virtual class tree" is formed with such
published methods, I do not know the need of it or the mission, but if
it is OK it is OK ;) for me.
--
Best regards,
José
Sure, I was just saying that in a different context. I found Marc's
observation very weird, and I'm (still) going to check it.
Its not my observation, but my implementations :)
Imagine the following "base" widgetdset tree (best viewed with a fixed
font)
TWSBase
|
+ TWSWinControl
| |
| + TWSButton
|
+ TWSSomeOther
Now we have a widgetset, say XXX, implementing these classes
when you use the normal inheritence you get a tree like:
TWSBase - TWSXXXBase
|
+ TWSWinControl - TWSXXXWinControl
| |
| + TWSButton - TWSXXXButton
|
+ TWSSomeOther - TWSXXXSomeOther
Now you see a problem here. You would expect TWSXXXButton to be
derived from TWSXXXWinControl, but it isn't, so it doesn't have the
TWSXXXWinControl implementation.
Now comes the "vitrual" class tree lazarus uses. Based on RTTI it
creates its own VMT tables, rewriting the tree to:
TWSBase
|
+ TWSXXXBase
|
+ TWSWinControl
| |
| + TWSXXXWinControl
| |
| + TWSButton
| |
| + TWSXXXButton
|
+ TWSSomeOther
|
+ TWSXXXSomeOther
Now TWSXXXButton is derived from TWSXXXWinControl
Interesting.....
I thought (not even sure why I thought it, or were I pcked it up; so it
may be wrong, in which case just tell me)...
... that the compiler could optimize an "inherited" call.
TBase = class
procedure Foo; virtual;
end
TChild= class
procedure Foo; override;
end
Now if I call "BaseVariable.Foo" from anywhere, it needs to find Foo in
the VMT, because the actual object could be of either class.
BUT
procedure TChild.Foo;
begin
inherited; // or: inerithed Foo;
// do more
end;
I thought that in this last case, the compiler would know, that
inherited points to TBase.Foo; and the compiler would optimize the code,
to call directly (skipping the VMT) ?
But I guess I am wrong about that? OR how else could the above work?
Martin
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal