是什么导致"W1010方法'%s'隐藏基类型'%s'的虚拟方法"警告?

Fab*_*zio 5 delphi inheritance overriding

我有一个带虚函数的基类:

TMyBaseClass = class(TObject)
public
  ValueOne : integer;
  procedure MyFunction(AValueOne : integer); virtual;
end;

procedure TMyBaseClass.MyFunction(AValueOne : integer);
begin
  ValueOne := ValueOne;
end;
Run Code Online (Sandbox Code Playgroud)

后代类实现具有相同名称的函数.此函数添加一个新参数并调用其anchestor的函数.

TMyDerivedClass = class(TMyBaseClass)
public
  ValueTwo : integer;
  procedure MyFunction(AValueOne : integer; AValueTwo : integer);
end;

procedure TMyDerivedClass.MyFunction(AValueOne : integer; AValueTwo : integer);
begin
  inherited MyFunction(AValueOne);
  ValueTwo := ValueTwo;
end;
Run Code Online (Sandbox Code Playgroud)

编译时,会显示以下警告消息:W1010方法

'MyFunction'隐藏基类型'TMyBaseClass'的虚方法

我找到了解决另一个问题的问题的解决方案,但我想知道是什么导致了这个警告.TMyDerivedClass.MyFunction是否隐藏TMyBaseClass.MyFunction,即使这两个函数具有不同的参数?如果是这样,为什么?

Dav*_*nan 8

文档 解释了这个问题很清楚:

您已声明了一个与基类中的虚方法同名的方法.您的新方法不是虚方法; 它将隐藏对同名基础方法的访问.

隐藏的含义是,从派生类中,您不再能够访问基类中声明的虚方法.您不能引用它,因为它与派生类中声明的方法具有相同的名称.后一种方法是从派生类中可见的方法.

如果两个方法都用overload指令标记,那么编译器可以使用它们的参数列表来区分它们.没有这一点,编译器可以做的就是隐藏基本方法.

阅读其他链接文档以获取有关潜在解决方案的建议.