【发布时间】: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