当我最近忘记添加关键字“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.dpr”构建 Project1.dproj(调试,Win32)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 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.
我的猜测是,要么我误解了 Jim McKeeth 的上述引用,要么我的编译器中有一些我不知道的设置(顺便说一下,我确实在另一台计算机上对其进行了测试,结果相同)。任何帮助将不胜感激。