<div dir="ltr"><div><div><div><div><div><div><div><div>Thanks.  Do you mean that the rules I see in the document apply to NORMAL virtual methods, but not virtual constructors?<br><br></div>Also,  I have a related question:  it seems that to override methods in ancestor it is required that the method has same signature, however reintroduce will not have such limitations.  Example:<br>

<br></div>constructor TBase.Create; virtual;<br>... ...<br></div>constructor TDerived.Create(AParam: TParamType); override<br><br></div>The above code won't compile until I change the override keyword to "reintroduce".  Because the compiler complains that there is no Create() with the same signature in the base class.<br>

<br></div>However, if I use reintroduce, according to the document, the compiler will make the Create method STATIC and hide the create method in the base class, in another word, it is then invalid to call  TDerived.Create;  (without param).    What is the mechanism here??   Also, if I do not use override or reintroduce, instead, put an "overload" there, it will make BOTH version of the constructor visible,   AND the "inherited" keyword also works well!<br>

<br></div>Could anyone explain these messes about:  virtual, override, overload, reintroduce??<br><br></div>Thanks a lot.<br></div>Shannon<br><div><div><div><div><div><div><div><div><br><br><br><br></div></div></div></div>

</div></div></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/8/20 Martin <span dir="ltr"><<a href="mailto:lazarus@mfriebe.de" target="_blank">lazarus@mfriebe.de</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


  
    
  
  <div text="#000000" bgcolor="#FFFFFF"><div class="im">
    <div>On 20/08/2013 02:44, Xiangrong Fang
      wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">
        <div>
          <div><span style="font-family:courier new,monospace">Hi All,<br>
              <br>
              I am reading this document: <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 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>
              <br>
            </span></div>
        </div>
      </div>
    </blockquote></div>
    ....<div class="im"><br>
    <blockquote type="cite">
      <div dir="ltr">
        <div><span style="font-family:courier new,monospace">The problem
            is, it makes NO DIFFERENCE at all in the following cases:<br>
            <br>
          </span></div>
        <div><span style="font-family:courier new,monospace">CASE 1:<br>
            <br>
          </span></div>
        <div><span style="font-family:courier new,monospace">TBase.Create;<br>
          </span></div>
        <div><span style="font-family:courier new,monospace">TDerived.Create;<br>
            <br>
          </span></div>
        <div><span style="font-family:courier new,monospace">CASE 2:<br>
            <br>
          </span></div>
        <div><span style="font-family:courier new,monospace">TBase.Create;
            virtual;<br>
          </span></div>
        <div><span style="font-family:courier new,monospace">TDerived.Create;
            virtual;<br>
            <br>
          </span></div>
        <div><span style="font-family:courier new,monospace">CASE 3:<br>
            <br>
          </span></div>
        <div><span style="font-family:courier new,monospace">TBase.Create;
            virtual;<br>
            TDerived.Create; override;<br>
            <br>
          </span></div>
        <div><span style="font-family:courier new,monospace">According
            to the document, "inherited" cannot be used in non-virtual
            methods, and it is wrong to use virtual in sub-class. But my
            test shows the contrary.   BTW, I am running Linux on 64bit
            platform.<br>
            <br>
          </span></div>
        <br>
      </div>
    </blockquote>
    <br></div>
    Using virtual with constructor makes a difference, if you use "class
    of" types<br>
    <br>
    type <br>
      TBaseClass = class of TBase;<br>
      TDerivedClass = class of TDerived;<br>
    <br>
    Var <br>
      bc: TBaseClass;<br>
    <br>
    begin<br>
      bc:= TBase;<br>
      bc.create;<br>
    <br>
      bc:= TDerived;<br>
      bc.create;  // will call Tderived.create, but only in case 3<br>
    end;<br>
  </div>

<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>