Re: [fpc-pascal] non-virtual class methods called from virtual regular method
On 29/04/2021 13:04, LacaK via fpc-pascal wrote: > In regular virtual method, I expect, that Self resolves to runtime class > type, thust calling CP1 should resolve to runtime type class method. It works the same for class methods and non-class methods: no virtual = no dynamic resolution when calling such a method. Jonas ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] non-virtual class methods called from virtual regular method
On Thu, 29 Apr 2021, LacaK via fpc-pascal wrote: Dňa 29.4.2021 o 9:26 Michael Van Canneyt via fpc-pascal napísal(a): On Thu, 29 Apr 2021, LacaK via fpc-pascal wrote: Hi *, consider the following example T1 = class class procedure CP1; procedure P1; virtual; end; T2 = class(T1) class procedure CP1; end; procedure T1.P1; begin CP1; // here is called allways T1.CP1, right? // if I want call T2.CP1 then class procedure CP1 must be also virtual, right? Yes // so Self.CP1 does not take runtime type but is staticaly resolved at compile time to T1.CP1 ? Yes. This is bit counter-intuitive for me: For me not, it's perfectly logical. Michael.___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] non-virtual class methods called from virtual regular method
Dňa 29.4.2021 o 9:26 Michael Van Canneyt via fpc-pascal napísal(a): On Thu, 29 Apr 2021, LacaK via fpc-pascal wrote: Hi *, consider the following example T1 = class class procedure CP1; procedure P1; virtual; end; T2 = class(T1) class procedure CP1; end; procedure T1.P1; begin CP1; // here is called allways T1.CP1, right? // if I want call T2.CP1 then class procedure CP1 must be also virtual, right? Yes // so Self.CP1 does not take runtime type but is staticaly resolved at compile time to T1.CP1 ? Yes. This is bit counter-intuitive for me: In regular virtual method, I expect, that Self resolves to runtime class type, thust calling CP1 should resolve to runtime type class method. But from compiler POV I understand, that symbol CP1 must be somehow resolved at compile time, so compiler looks at CP1 method definition (and if not virtual then resolves to class method of type where is used). In principle *virtual* class methods as such are for me strange ;-) end; var c1: T1; begin c1:=T2.Create; c1.P1; // here is called T2.P1 - runtime class type end. Thanks Btw If I need for various class descendants define various class constants, it is possible only by using class functions (getters), where descendant class getter hides parents getter? If they depend on the class, they're not "constants" to begin with, so a getter function is the right approach. For such purposes I use virtual class functions. Yes, on other side virtual constants will be construct which I would understand better: If I need override some class wide parameter: T1 = class private const CPORT=0; // virtual end; T1 = class (T2) private const CPORT=2; // override end; Now I must do: T1 = class private class procedure GetPORT: integer; virtual; end; T2 = class(T1) private class procedure GetPORT: integer; override; end; class procedure T1.GetPORT: integer; begin Result := 0; end; class procedure T2.GetPORT: integer; begin Result := 2; end; I accept, that polymorphism in class inheritance work this way ... L. ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] non-virtual class methods called from virtual regular method
On Thu, 29 Apr 2021, LacaK via fpc-pascal wrote: Hi *, consider the following example T1 = class class procedure CP1; procedure P1; virtual; end; T2 = class(T1) class procedure CP1; end; procedure T1.P1; begin CP1; // here is called allways T1.CP1, right? // if I want call T2.CP1 then class procedure CP1 must be also virtual, right? Yes // so Self.CP1 does not take runtime type but is staticaly resolved at compile time to T1.CP1 ? Yes. end; var c1: T1; begin c1:=T2.Create; c1.P1; // here is called T2.P1 - runtime class type end. Thanks Btw If I need for various class descendants define various class constants, it is possible only by using class functions (getters), where descendant class getter hides parents getter? If they depend on the class, they're not "constants" to begin with, so a getter function is the right approach. For such purposes I use virtual class functions. Michael.___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
[fpc-pascal] non-virtual class methods called from virtual regular method
Hi *, consider the following example T1 = class class procedure CP1; procedure P1; virtual; end; T2 = class(T1) class procedure CP1; end; procedure T1.P1; begin CP1; // here is called allways T1.CP1, right? // if I want call T2.CP1 then class procedure CP1 must be also virtual, right? // so Self.CP1 does not take runtime type but is staticaly resolved at compile time to T1.CP1 ? end; var c1: T1; begin c1:=T2.Create; c1.P1; // here is called T2.P1 - runtime class type end. Thanks Btw If I need for various class descendants define various class constants, it is possible only by using class functions (getters), where descendant class getter hides parents getter? -Laco. ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal