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

时间:2013-07-01 16:13:57

标签: delphi polymorphism compiler-warnings

当我忘记最近添加关键词'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(Debug,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 :\程序     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 \弧度     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:\程序     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 个答案:

答案 0 :(得分:5)

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

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