[fpc-pascal] virtual method and generics

Sven Barth pascaldragon at googlemail.com
Tue Nov 19 10:47:47 CET 2013


Am 19.11.2013 10:21 schrieb "Xiangrong Fang" <xrfang at gmail.com>:
>
> Hi,
>
> In my TTree class:
https://github.com/xrfang/fpcollection/blob/master/src/units/tree.pas
>
> I have the following method:
>
> function TTree.Load(s: TStream): Integer;
> var
>   lv, c: QWord;
>   node: TTree;
>   buf: Pointer;
> begin
>   Clear;
>   if not ReadNodeData(s, lv, buf, c) then Exit(0);
>   DoRestore(buf);
>   OnRestore;            //<-- CALL#1
>   FreeMem(buf, c);
>   Result := 1;
>   node := Self;
>   while ReadNodeData(s, lv, buf, c) do begin
>     while (node <> nil) and (lv < node.Level) do node := node.Parent;
>     if (lv = node.Level) and (node <> Self) then
>       node := TTree.Create(Data, node.Parent)
>     else
>       node := TTree.Create(Data, node);
>     node.DoRestore(buf);
>     node.OnRestore;      //<-- CALL#2
>     FreeMem(buf, c);
>     Inc(Result);
>   end;
> end;
>
> Now I have a problem. CALL#1 is virtual as expected (sub-class's
OnRestore is called), but CALL#2 is not virtual, it just call the (empty)
OnRestore method defined in TTree.
>
> How to solve this problem?

The problem is that you are creating a TTree instance (the TTree.Create)
and not an instance of the current node type. Use "node :=
TTree(ClassType).Create(...)" instead of "node := TTree.Create(...)" at the
two locations where you create the node.

Also this problem is not related to generics, but would happen in a
non-generic class as well.

Regards,
Sven
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20131119/57395352/attachment.html>


More information about the fpc-pascal mailing list