Spa*_*ook 7 delphi polymorphism compiler-warnings
当我忘记在最近添加关键词'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.
Run Code Online (Sandbox Code Playgroud)
我正在使用Delphi XE,我的编译器说一切都很好:
检查项目依赖...大厦Project1.dproj(调试的Win32)为 "Project1.dpr" C DCC命令行:\ 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 :\用户\公用\文档\ RAD Studio在\ 8.0\DCP ";" C:\ Program Files文件\ Embarcadero公司\ RAD Studio在\ 8.0 \包括 ";" C:\ Program Files文件\ Raize\CS4\LIB\RS-XE" ;"c:\ program files\embarcadero\rad studio\8.
我的猜测是,我误解了Jim McKeeth的上述引用,或者我在编译器中有一些我不知道的设置(顺便提一下,我在另一台计算机上测试过,结果相同).任何帮助将不胜感激.
该文档描述了如下这些特定的警告:
HIDDEN_VIRTUAL:打开或关闭当后代声明与祖先中的方法同名的方法时产生的警告,并且祖先方法是虚拟的,但后代的方法不是覆盖.
(参见W1010方法'%s'隐藏基类型'%s'(Delphi)的虚方法.)HIDING_MEMBER:当后代声明与祖先中的属性同名的新属性时,打开或关闭警告.
(参见W1009'%s'的重新声明隐藏基类中的成员(Delphi).)
这两个警告都不适用于您的代码.在这种情况下HIDDEN_VIRTUAL,您没有任何虚拟方法.如果HIDING_MEMBER你没有任何属性.
按照上面引用部分(或第一句中的主文档链接)中的链接查找这些警告的完整详细信息.
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |