【问题标题】:The compiler does not give a warning while hiding member variables and/or procedures编译器在隐藏成员变量和/或过程时不给出警告
【发布时间】:2013-06-28 20:16:39
【问题描述】:

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

根据this answer(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:\编译器输出"-I"c:\program files\embarcadero\rad studio\8.0\lib\Win32\debug";"c:\program 文件\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 工作室\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 :\程序 文件\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 \拉德 工作室\8.0\lib\win32\release";"c:\program files\embarcadero\rad studio\8.0\RaveReports\Lib" -U"c:\program files\embarcadero\rad 工作室\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:\程序 文件\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 的上述引用,要么我的编译器中有一些我不知道的设置(顺便说一下,我确实在另一台计算机上对其进行了测试,结果相同)。任何帮助将不胜感激。

【问题讨论】:

  • 引用的答案是错误的,该问题的其他几个答案也是错误的。我已经修复了该答案中的不准确之处。

标签: delphi polymorphism compiler-warnings


【解决方案1】:

documentation 对这些特定警告的描述如下:

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,您没有任何属性。

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

【讨论】:

  • 大卫,感谢您的快速答复。因此,这种行为似乎是设计使然。然而,这不是直接与 Jim McKeeth 的引述相矛盾吗?如果是这样,你会不会说吉姆的话实际上更有意义?无论哪种方式,如果确实如此,您是否同意应该编辑 Jim 的答案,因为它不真实(即不完整)且具有误导性?
  • 我会说这是设计使然。隐藏静态方法有些正常。隐藏虚拟是非常不寻常和危险的。同样的属性。吉姆的回答不准确。
  • 好的,很公平。出乎我的意料,但我猜你每天都会学到一些新东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多