当我忘记最近添加关键词'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的上述引用,或者我在编译器中有一些我不知道的设置(顺便提一下,我在另一台计算机上测试了它,结果相同)。任何帮助将不胜感激。
答案 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
的情况下,您没有任何属性。
按照上面引用部分(或第一句中的主要文档链接)中的链接查找这些警告的完整详细信息。