[fpc-pascal] Understanding virtual methods
Flávio Etrusco
flavio.etrusco at gmail.com
Tue Aug 20 09:36:11 CEST 2013
On Tue, Aug 20, 2013 at 2:34 AM, Xiangrong Fang <xrfang at gmail.com> wrote:
> Hi Flavio,
>
> Your findings confirmed mine, but not telling me why?
I don't know why, maybe FPC used to be more strict about the use of
inherited, or the docs are simply wrong.
> It seems that the "virtual" keyword has no use at all!
It does, and the documentation is correct in this respect.
> To confirm this, I just removed the
> "inherited" call in TDerived, then re-run the program with or without
> "virtual/override", the result is exactly same, i.e. with c2 (declared as
> TBase), the following statements ALWAYS calls constructor of TDerived, NOT
> TBase:
>
> c2 := TDerived.Create;
> c2 := TBase(TDerived.Create);
As I said - or tried to say ;) - in the other post, there won't be a
difference when invoking the constructor on a "class literal"
directly.
The second line will generate the exact same code as the first one;
you're instantiating a TDerived instance then "upcasting" it to TBase.
> This is not same as the description in:
> http://www.freepascal.org/docs-html/ref/refsu26.html
Note this page is about methods and you're using constructors in your example.
I would recommend you first do your tests on method declarations, and
later learn about class references (i.e. "class of" declarations) and
constructors.
> BTW, the above documents are talking about objects, but I am using classes,
> is there any difference here?
>
> Shannon
AFAIU per the first page you sent, you can't shadow/reintroduce a
virtual method in an object; when you redeclare a virtual method it
overrides the base one.
-Flávio
More information about the fpc-pascal
mailing list