delphi中,
在类中定义了一个静态函数,
但它的父类中存在同名的函数,并且是虚函数,
且类中定义的这个静态函数没有重写,
结果会怎样?

解决方案 »

  1.   

    [Warning] Unit2.pas(16): Method 'test' hides virtual method of base type 'TForm1'
    这个问题自己测试一下不就OK了……类中定义了一个静态函数,
    但它的父类中存在同名的函数,并且是虚函数,
    且类中定义的这个静态函数没有重写,
    //调用类的静态函数时只执行了本类中静态函数,父类的静态函数不会执行
      

  2.   

    just have a try!!! and debug the programme by yourself!!!
      

  3.   

      public
        procedure DoCreate; reintroduce;
        //reintroduce去掉编译器的提示:Method 'DoCreate' hides virtual method of base type 'TCustomForm'
        { Public declarations }
    procedure TForm1.DoCreate;//基类TCustomForm有同名的虚拟方法DoCreate
    begin
      inherited;//在没有override的情况下,依然可以调用TCustomForm的DoCreate
      ShowMessage('DoCreate')
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ShowMessage('FormCreate')
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      DoCreate
    end;
      

  4.   

    因为你的CreateParams没有被调用到!!!所以被优化了!!!
    运行时调用的是TCustomForm的CreateParams!!!
    像这种情况还是要加上override!!!
      

  5.   

    1楼的case5166和9楼的s11s说的对,
    子类虽然定义了同名行数(未重写),但是根本就没有地方调用这个函数,所以被优化了。
    如果子类中的重名函数使用了重写,那么该函数CreateParams就会被其祖先TWinControl的procedure TWinControl.CreateWnd;函数来调用
      

  6.   

    取决于你在声明的时候,有没有加修词,比如override
    编译时会有提示 :与父类重名,父类方法是虚函数,但这里不是override; 编译是通过的因为没有加,表示你重新定义了一个方法,与父类方法是2回事(没有任何关系),运行时当然不会调用了非要往错误的方向走,谁管的了你呢
      

  7.   

    不是非要往错误的方向走,是知识浅薄,一不小心就走到错误的方向了,只好纠正。
    -----------
    起因是参照别人的资料使用了TForm的CreateParams函数,然后将函数体的定义部分复制到了TForm的protected下,结果发现编译时被优化掉了。所以才产生了这个帖子。