[讨论] 你所不知道的inherited

ZuoBaoquan 2009-01-04 12:50:05
我们直奔主题,看看下面这段代码,你觉得程序的运行结果是什么?


program TestInherited;

{$APPTYPE CONSOLE}

uses
SysUtils, Dialogs;

type
TBase = class
public
constructor Create; overload;
constructor Create(value: Integer); overload;
end;

TDerived = class(TBase)
public
constructor Create(value: Boolean = False); overload;
end;

{ TBase }

constructor TBase.Create;
begin
ShowMessage('TBase.Create');
end;

constructor TBase.Create(value: Integer);
begin
ShowMessage('TBase.Create(value: Integer)');
end;

{ TDerived }

constructor TDerived.Create(value: Boolean);
begin
inherited;
ShowMessage('TDerived.Create');
end;

var
example: TDerived;

begin
try
example := TDerived.Create;
try
// do nothing
finally
example.Free;
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.

...全文
73 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
深宇 2009-04-15
  • 打赏
  • 举报
回复
那两个严重BUG在3379版本里已经修复了
budded 2009-01-04
  • 打赏
  • 举报
回复
正常现象
starluck 2009-01-04
  • 打赏
  • 举报
回复
program TestInherited;

{$APPTYPE CONSOLE}

uses
SysUtils, Dialogs;

type
TBase = class
public
constructor Create; overload;
constructor Create(value: Integer); overload;
end;

TDerived = class(TBase)
public
constructor Create(value: Boolean = False); overload;
end;

{ TBase }

constructor TBase.Create;
begin
ShowMessage('TBase.Create');
end;

constructor TBase.Create(value: Integer);
begin
ShowMessage('TBase.Create(value: Integer)');
end;

{ TDerived }

constructor TDerived.Create(value: Boolean);
begin
inherited;
ShowMessage('TDerived.Create');
end;

var
example: TDerived;

begin
try
example := TDerived.Create;
try
// do nothing
finally
example.Free;
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.


只会 ShowMessage('TDerived.Create');

如果 inherited create;的话,将继承基类的CREATE事件

gwhdaxia 2009-01-04
  • 打赏
  • 举报
回复
inherited; 如果后面没有指定参数,那么就会找父类的相同名称,相同参数,
TBase里没有constructor Create(value: Boolean = False); 所以TBase里没找到相同的,

所以结果只是出现个'TDerived.Create '


如果指定了,就找指定的,比如说
constructor TDerived.Create(value: Boolean);
begin
inherited Create ;
ShowMessage('TDerived.Create');
end;

这里才先执行TBase.Create;
结果就是
'TBase.Create'
'TDerived.Create '
datm 2009-01-04
  • 打赏
  • 举报
回复
因为Create后面的参数类型不一致,所以不会区执行TBase.Create
ZuoBaoquan 2009-01-04
  • 打赏
  • 举报
回复
Yeah,回答正确!
我在使用Delphi2009泛型容器的时候,发现了几个严重Bug。其中一个就是因为TObjectList<T>使用inherited而导致没有正确初始化。

详见:Delphi 2009 泛型容器的两个严重Bug及深入分析
http://www.cnblogs.com/baoquan/archive/2009/01/03/1367702.html

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧