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

时间:2016-08-23 07:42:04

标签: delphi inheritance overrides

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

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

procedure TMyBaseClass.MyFunction(AValueOne : integer);
begin
  ValueOne := ValueOne;
end;

后代类实现具有相同名称的函数。 这个函数添加了一个新的参数并调用它的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;

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

  

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

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

1 个答案:

答案 0 :(得分:8)

documentation非常清楚地解释了这个问题:

  

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

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

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

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