我是一个有虚函数的基类:
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,即使这两个函数具有不同的参数?如果是这样,为什么?
答案 0 :(得分:8)
documentation非常清楚地解释了这个问题:
您已声明了一个与基类中的虚方法同名的方法。您的新方法不是虚方法;它将隐藏对同名基础方法的访问。
隐藏的含义是,从派生类中您无法再访问基类中声明的虚方法。您不能引用它,因为它与派生类中声明的方法具有相同的名称。后一种方法是从派生类中可见的方法。
如果两个方法都用overload
指令标记,那么编译器可以使用它们的参数列表来区分它们。没有这一点,编译器可以做的就是隐藏基本方法。
阅读其他链接文档以获取有关潜在解决方案的建议。