最近我忘记添加关键字“virtual”和“override”,当我在派生类中无意中使用相同的过程名称时,我本应该期望编译器发出警告。但是我没有收到任何警告,现在我不明白为什么。我需要做什么才能获得隐藏基类成员和方法的警告?
根据此答案(Jim McKeeth的答案无疑是正确的):
如果在后代类中声明了与祖先类中方法相同的方法,则表示您正在隐藏该祖先方法-这意味着如果您有该后代类的实例(被引用为该类),则您将无法获得祖先的行为。编译器会给出警告。
然而,令我惊讶的是,这段代码没有给我任何警告:
我的猜测是我可能误解了Jim McKeeth之前的引用,或者我的编译器设置有些问题(顺便说一下,我已经在另一台电脑上测试过了,结果相同)。非常感谢任何帮助。
根据此答案(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:\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:\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" -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\rad 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:\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" -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之前的引用,或者我的编译器设置有些问题(顺便说一下,我已经在另一台电脑上测试过了,结果相同)。非常感谢任何帮助。