【发布时间】:2012-03-06 00:53:12
【问题描述】:
我只是想问一个简单的问题 - 我有一个从 TLabel 派生的类,如下所示:
TMyLabel = class (TLabel)
...
constructor Create(AOwner: TComponent); override;
end;
constructor TMyLabel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{ some code }
end;
现在,Delphi 让我可以编译带有和不带有 覆盖 的两个版本。你能解释一下有什么区别吗?除了在覆盖时无法在Create() 中请求我自己的参数。谢谢
编辑:我的意思是 - virtual 和非虚拟基础后代构造函数之间有什么区别?我总是可以通过inherited Create()调用继承的构造函数,那有什么意义呢?
【问题讨论】:
-
如果你不这样做,编译器会给你一个警告,对吧?来自链接的副本; “如果您不这样做,编译器可能会警告您 TMinMatrix 的构造函数正在“隐藏” TMatrix 的构造函数。” -- 我还没有遇到隐藏组件构造函数的实际需要,特别是 TCOmponent 似乎依赖于构造函数和析构函数的正确虚拟行为,所以一般来说,对于 TComponent,它实际上接近错误。跨度>
-
是的,确实如此。它可能是“隐藏”它,因为它不是直接的后代,但既然我用
inherited调用它,它有什么区别吗? -
好吧,在构造函数内部对你没有任何影响,但是如果有人去继承 TMyLabel,你故意破坏了继承链,对吧?我的猜测是,在某些实际情况下你会想要,但不是 TComponents。