<div dir="ltr"><div>Hi Flavio,<br><br></div><div>Your findings confirmed mine, but not telling me why? It seems that the "virtual" keyword has no use at all!   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:<br>

<br></div><div>c2 := TDerived.Create;<br></div><div>c2 := TBase(TDerived.Create);<br><br></div><div>This is not same as the description in: <a href="http://www.freepascal.org/docs-html/ref/refsu26.html">http://www.freepascal.org/docs-html/ref/refsu26.html</a><br>

<br></div><div>BTW, the above documents are talking about objects, but I am using classes, is there any difference here?<br><br></div><div>Shannon<br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">

2013/8/20 Flávio Etrusco <span dir="ltr"><<a href="mailto:flavio.etrusco@gmail.com" target="_blank">flavio.etrusco@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="HOEnZb"><div class="h5">On Mon, Aug 19, 2013 at 10:44 PM, Xiangrong Fang <<a href="mailto:xrfang@gmail.com">xrfang@gmail.com</a>> wrote:<br>
> Hi All,<br>
><br>
> I am reading this document:<br>
> <a href="http://www.freepascal.org/docs-html/ref/refsu29.html" target="_blank">http://www.freepascal.org/docs-html/ref/refsu29.html</a>   and doing an<br>
> experiment with the following code:<br>
><br>
> program project1;<br>
> {$mode objfpc}{$H+}<br>
> type<br>
>   TBase = class<br>
>     constructor Create; virtual;<br>
>   end;<br>
>   TDerived = class(TBase)<br>
>     constructor Create; override;<br>
>   end;<br>
><br>
> var<br>
>   c1, c2: TBase;<br>
>   c3: TDerived;<br>
><br>
> constructor TDerived.Create;<br>
> begin<br>
>   WriteLn('Entering TDerived.Create');<br>
>   inherited Create;<br>
>   WriteLn('Leaving TDerived.Create');<br>
> end;<br>
><br>
> constructor TBase.Create;<br>
> begin<br>
>   WriteLn('Entering TBase.Create');<br>
>   Writeln('Leaving TBase.Create');<br>
> end;<br>
><br>
> begin<br>
>   WriteLn('Creating a TBase and assigning to TBase variable...');<br>
>   c1 := TBase.Create;<br>
>   WriteLn('Creating a TDerived and assigning to TBase variable...');<br>
>   c2 := TDerived.Create;<br>
>   WriteLn('Creating a TDerived and assigning to TDerived variable...');<br>
>   c3 := TDerived.Create;<br>
> end.<br>
><br>
><br>
> The problem is, it makes NO DIFFERENCE at all in the following cases:<br>
><br>
> CASE 1:<br>
><br>
> TBase.Create;<br>
> TDerived.Create;<br>
><br>
> CASE 2:<br>
><br>
> TBase.Create; virtual;<br>
> TDerived.Create; virtual;<br>
><br>
> CASE 3:<br>
><br>
> TBase.Create; virtual;<br>
> TDerived.Create; override;<br>
><br>
> According to the document, "inherited" cannot be used in non-virtual<br>
> methods,<br>
<br>
</div></div>At least that's the result I would expect :)<br>
I can confirm your findings; contrary to the documentation, a simple<br>
test works correctly (the compiler prints no warnings or hints, both<br>
method and constructor work correctly, calling either a non-virtual<br>
from virtual, and virtual from non-virtual).<br>
<div class="im"><br>
<br>
> and it is wrong to use virtual in sub-class.<br>
<br>
</div>It doesn't say that, it simply says that the redeclaration will not<br>
override the base implementation (the different behavior for 'object'<br>
is news to me!).<br>
<br>
FWIW your test doesn't actually "exercise" inheritance, since virtual<br>
constructors only make a difference when you call from a class<br>
reference (similarly, you'll only see a difference in virtual methods<br>
when calling from a base-typed variable).<br>
<br>
Code>>><br>
var MyClass: TComponentClass = TDataModule;<br>
begin<br>
  MyClass.Create(nil);<br>
<<<<br>
<br>
will instantiate a TDataModule.<br>
<br>
Code>>><br>
var MyControl: TControl;<br>
begin<br>
  MyControl := TButton.Create;<br>
  MyControl.ExecuteDefaultAction;<br>
<<<<br>
<br>
will invoke TButton's implementation of ExecuteDefaultAction.<br>
<div class="im"><br>
> But my test shows the  contrary.   BTW, I am running Linux on 64bit platform.<br>
><br>
> Regards,<br>
> Shannon<br>
<br>
</div>Best regards,<br>
Flávio<br>
_______________________________________________<br>
fpc-pascal maillist  -  <a href="mailto:fpc-pascal@lists.freepascal.org">fpc-pascal@lists.freepascal.org</a><br>
<a href="http://lists.freepascal.org/mailman/listinfo/fpc-pascal" target="_blank">http://lists.freepascal.org/mailman/listinfo/fpc-pascal</a><br>
</blockquote></div><br></div>