7

当我最近忘记添加关键字“virtual”和“override”时,如果我不小心为派生类中的过程使用了相同的名称,我会期待编译器警告。我没有,现在我不明白为什么。我需要做什么才能获得隐藏基本成员和方法的警告?

根据这个答案(Jim McKeeth,他无疑是正确的):

如果您在后代类中声明与祖先类中的方法同名的方法,那么您将隐藏该祖先方法 - 这意味着如果您有该后代类的实例(被引用为该类),那么您将没有得到祖先的行为。编译器会给你一个警告。

然而,令我惊讶的是,这段代码并没有给我一个警告:

unit Unit1;

interface

{$WARNINGS ON}
{$WARN HIDING_MEMBER ON}
{$WARN HIDDEN_VIRTUAL ON}
// I understand the two lines above are superfluous.
// I put them there to demonstrate that I have tried to enable these
// warnings explicitly.

type
    TBase = class
    public
        SomeMember: integer;
        procedure Foo;
    end;

type
    TDerived = class (TBase)
    public
        SomeMember: integer;
        procedure Foo;
    end;

implementation


{ TBase }

procedure TBase.Foo;
begin

end;

{ TDerived }

procedure TDerived.Foo;
begin

end;

end.

我正在使用 Delphi XE,我的编译器说一切都很好:

检查项目依赖关系...为“Project1.dpr”构建 Project1.dproj(调试,Win32)dcc 命令行 c:\program files\embarcadero\rad studio\8.0\bin\dcc32.exe -$O- -$W+ - $YD --no-config -B -Q -AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE; DbiProcs=BDE;DbiErrs=BDE -DDEBUG -E"C:\编译器输出"-I"c:\program files\embarcadero\rad studio\8.0\lib\Win32\debug";"c:\program files\embarcadero\ rad studio\8.0\RaveReports\Lib";"c:\program files\embarcadero\rad studio\8.0\lib\win32\debug";"c:\program files\embarcadero\rad studio\8.0\Imports";"C :\Users\Public\Documents\RAD Studio\8.0\Dcp";"c:\program files\embarcadero\rad studio\8.0\include";"C:\Program Files\Raize\CS4\Lib\RS-XE" ;"c:\program files\embarcadero\rad studio\8.

我的猜测是,要么我误解了 Jim McKeeth 的上述引用,要么我的编译器中有一些我不知道的设置(顺便说一下,我确实在另一台计算机上对其进行了测试,结果相同)。任何帮助将不胜感激。

4

1 回答 1

5

文档描述了这些特定的警告,如下所示:

HIDDEN_VIRTUAL:打开或关闭当后代声明与祖先中的方法同名的方法时产生的警告,并且祖先方法是虚拟的,但后代的方法不是覆盖。
(请参阅W1010 方法 '%s' 隐藏基本类型 '%s' (Delphi) 的虚拟方法。)

HIDING_MEMBER:打开或关闭当后代声明与祖先中的属性同名的新属性时产生的警告。
(请参阅W1009 重新声明“%s”隐藏了基类 (Delphi) 中的成员。)

这两个警告都不适用于您的代码。在 的情况下HIDDEN_VIRTUAL,您没有任何虚拟方法。并且在HIDING_MEMBER您没有任何属性的情况下。

按照上面引用部分中的链接(或第一句中的主要文档链接)查找这些警告的完整详细信息。

于 2013-07-01T16:22:03.797 回答