编译器在隐藏成员变量和/或过程时不会发出警告

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.dproj(调试,Win32) "Project1.dpr" 的 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:\Compiler Output" -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.0\lib\win32\release";"c:\program files\embarcadero\rad studio\8.0\RaveReports\Lib" -LE"C:\Users\Public\Documents\RAD Studio\8.0\Bpl" -LN"c:\program files\embarcadero\rad studio\8.0\bin\Dcp" -N0"C:\Compiler Output\DCU" -O"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.0\lib\win32\release"; "c:\program files\embarcadero\rad studio\8.0\RaveReports\Lib" -R"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.0\lib\win32\release";"c:\program files\embarcadero\rad studio\8.0\RaveReports\Lib" -U"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.0\lib\win32\release"; "c:\program files\embarcadero\rad studio\8.0\RaveReports\Lib" -K00400000 -NB"c:\program files\embarcadero\rad studio\8.0\bin\Dcp" -NH"C:\Users\Public\Documents\RAD Studio\8.0\hpp" -NO"C:\Compiler Output\DCU" Project1.dpr 成功 经过时间:00:00:00.2
我的猜测是我可能误解了Jim McKeeth之前的引用,或者我的编译器设置有些问题(顺便说一下,我已经在另一台电脑上测试过了,结果相同)。非常感谢任何帮助。

1
参考答案是错误的,还有其他几个回答也是错误的。我已经修正了那个答案中的不准确之处。 - Rob Kennedy
1个回答

5

文档描述了以下特定警告:

HIDDEN_VIRTUAL:打开或关闭当子类声明与祖先类中的方法同名且祖先类的方法是虚函数但子类的方法不是覆盖时所产生的警告。
(参见W1010 Method '%s' hides virtual method of base type '%s' (Delphi)。)

HIDING_MEMBER:打开或关闭当子类声明与祖先类中的属性同名时所产生的警告。
(参见W1009 Redeclaration of '%s' hides a member in the base class (Delphi)。)

这两个警告都不适用于您的代码。对于HIDDEN_VIRTUAL,您没有任何虚拟方法。而对于HIDING_MEMBER,您没有任何属性。

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


David,感谢您的迅速回答。看起来这种行为是设计上的如此。然而,这是否直接与Jim McKeeth的引言相矛盾呢?如果是这样,您不认为Jim的引言更有道理吗?无论如何,如果真是这种情况,您是否同意应该编辑Jim的回答,因为它不是真实的(即不完整)并且具有误导性? - SpaghettiCook
我认为这是故意设计的。隐藏静态方法有点常见。隐藏虚拟方法非常不寻常和危险。同样适用于属性。Jim的回答不准确。 - David Heffernan
好的,很公平。虽然不是我预期的,但我想每天都能学到新东西。 - SpaghettiCook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接