好奇,为什么Create函数明明是个构造函数,还要带上override;这是C++里没有的事情。我虽然也明白其大致的作用和目的,但还是没有见到官方和权威的说法。如果哪位大大见到此文,还望给一个详细一点的解释,谢谢。

----------------------------VCL关键类-------------------

TObject = class
constructor Create; // 注意不带参数。可能虚构造函数只对某一个起作用,而不是全体
destructor Destroy; virtual;

TPersistent = class(TObject)
没有构造函数和析构函数

TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
constructor Create(AOwner: TComponent); virtual;
destructor Destroy; override;

TControl = class(TComponent)
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

TWinControl = class(TControl)
constructor Create(AOwner: TComponent); override;
constructor CreateParented(ParentWindow: HWnd); // 注意,这里还不是overload,因为构造函数的名称不同
destructor Destroy; override;

TGraphicControl = class(TControl)
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

TCustomControl = class(TWinControl)
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

----------------------------具体的控件类-------------------
TCustomLabel = class(TGraphicControl)
constructor Create(AOwner: TComponent); override; // 统统都有覆盖,应该是为了方便TControlClass来创建类(不是类对象)
没有析构函数
TLabel = class(TCustomLabel)
没有构造函数和析构函数,只发布属性

TCustomEdit = class(TWinControl)
constructor Create(AOwner: TComponent); override;
TEdit = class(TCustomEdit)
没有构造函数和析构函数,只发布属性

TButtonControl = class(TWinControl)
constructor Create(AOwner: TComponent); override;
没有析构函数
TCustomButton = class(TButtonControl)
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
TButton = class(TCustomButton)
没有构造函数和析构函数,只发布属性

----------------------------总结-------------------
析构函数从TObject开始就是虚函数,因为每个类都要释放内存和其它资源,方便覆盖并使用。
构造函数从TComponent开始是虚函数,所有继承类只要是使用这个Create(AOwner: TComponent)这个函数都要写上override,猜测目的是方便元类(类引用、类之类)正确调用其构造函数。但对直接继承TObject的类没有这个要求。

TPersistent没有构造以及析构函数,不知道其调用情况是怎么样的。有空改写VCL库做一下测试。

----------------------------问题-------------------
Delphi的函数修饰关键字过多、过于强大和精确,以至于很难精确掌握其使用。Java所有函数全部都是虚函数、可重载、可覆盖。C++重载不需要程序员管,覆盖也是自动的,更没有reintroduce,缺点是我发现一旦覆盖父类的某一个函数,那么会把父类所有的同名但不同参数的函数都会藏起来,这样的默认陷阱不知道还有多少。不像Delphi可以精确控制,但学起来也挺麻烦。
virtual - Mark this as a function where you will want run-time dispatching (allows polymorphic behavior). This is only for the initial definition, not when overriding in subclasses.
override - Provide a new implementation for a virtual method.
overload - Mark a function with the same name as another function, but a different parameter list.
reintroduce - Tell the compiler you actually intended to hide a virtual method, instead of merely forgetting to supply override.

原理明白了,但是有几个例子无法搞清,有功夫再回来研究:
http://stackoverflow.com/questions/3876040/delphi-understanding-constructors
http://stackoverflow.com/questions/3874330/delphi-how-to-hide-ancestor-constructors

官方参考:
http://docwiki.embarcadero.com/RADStudio/XE6/en/Methods

VCL里的构造函数的更多相关文章

  1. WM_NCHITTEST有21种取值,常用的有HTCAPTION,HTCLIENT,HTBORDER,HTSYSMENU,HTTRANSPARENT,罗列所有VCL里对其使用的情况

    我为了移动一个无标题栏的窗体,使用了WM_NCHITTEST消息,这个消息大概如下: 通常,我们拖动对话框窗口的标题栏来移动窗口,但有时候,我们想通过鼠标在客户区上拖动来移动窗口. 一个容易想到的方案 ...

  2. Java里的构造函数(构造方法)

    构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型 ...

  3. VCL里为什么要用类函数代替API,为什么要用CM_消息代替虚函数

    之所以要用类函数代替API,是因为VCL对它做了一些包装,好在API起作用之前和之后做一些额外的事情:通知和判断等等.之所以类函数要包装一个CM_消息,是因为这样方便程序员(在调用类函数的基础上)截断 ...

  4. Autowired注解的妙用---在Controller里的构造函数里获取需要注入的对象

    /*@Resource private Observer<TaxiObserverVo> taxiPushObserver; @Resource private Observer<T ...

  5. 研究一下FBrush,它是从TWinControl才有的属性(可能是因为需要句柄)——发现{$R *.dfm}在运行期执行,而且很有深意,读到属性后赋值还会触发事件,这些无法在VCL代码里直接看到

    定义和创建: TWinControl = class(TControl) private FBrush: TBrush; end; constructor TWinControl.Create(AOw ...

  6. 让VCL的皮肤用在手机程序里 让安桌程序不山寨[转]

    ① 就用那个bitmap设计工具,先打开vcl里的皮肤(..... \Embarcadero\RAD Studio\12.0\Redist\styles\vcl里) ② save as      转换 ...

  7. javascript --- 设计模式之构造函数模式

    在JavaScript里,构造函数通常是认为用来实现实例的,JavaScript没有类的概念,但是有特殊的构造函数.通过new关键字来调用定义的否早函数,你可以告诉JavaScript你要创建一个新对 ...

  8. 转:C++编程隐蔽错误:error C2533: 构造函数不能有返回类型

    C++编程隐蔽错误:error C2533: 构造函数不能有返回类型 今天在编写类的时候,出现的错误. 提示一个类的构造函数不能够有返回类型.在cpp文件里,该构造函数定义处并没有返回类型.在头文件里 ...

  9. JavaScript设计模式之构造函数模式

    一.构造函数模式概念 构造函数用于创建特定类型的对象——不仅声明了使用过的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象 ...

随机推荐

  1. linux内核学习之四:进程切换简述【转】

    转自:http://www.cnblogs.com/xiongyuanxiong/p/3531884.html 在讲述专业知识前,先讲讲我学习linux内核使用的入门书籍:<深入理解linux内 ...

  2. linux内核设计与实现第一章

    1.1 unix的历史 Thompson实现unix 伯克利大学对其进一步开发推出了著名的BSD 其他各大厂商相继推出自己的unix 1.1.2 unix的特性 unix系统是一个强大,健壮,稳定的操 ...

  3. Python Challenge 第五关

    进入第五关,一张图和一行提示: pronounce it.右键源代码,只有一行注释: <!-- peak hell sounds familiar ? --> peak hell 听起来熟 ...

  4. 在Eclipse中打开Hadoop工程

    1. 安装虚拟机,我用的是VMware Workstation 12 Player 2. 在VM中安装Ubuntu,我用的镜像文件是ubuntu-15.10-desktop-amd64.iso 3. ...

  5. (4)DataTable

    引用 using System.Data; 创建DataTable DataTable dt = new DataTable(); //指定表明,当把这个table添加到dataset时你就可以用da ...

  6. 洛谷——P3252 [JLOI2012]树

    P3252 [JLOI2012]树 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度 ...

  7. ubuntu系统克隆

    使用clonezilla,原文地址:http://www.linuxidc.com/Linux/2014-09/107117.htm 类似的一篇:http://storysky.blog.51cto. ...

  8. Java RandomAccessFile类

    RandomAccessFile类是Java中操作文件内容功能最强大的类,既可以读,也可以写. RandomAccessFile支持随机访问,可以直接访问文件的任意位置,在文件的任意位置读写数据.如果 ...

  9. BZOJ1367【Baltic2004】sequence

    题面 Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Output 13 Hint 所求的Z序列为6,7, ...

  10. Css Position定位(简易版本)

    准备前的知识: 定位只对块级起作用.如div,p等元素是块级元素,如果是内联元素则可以先变成块级元素,display:block即可. 开始讲解: 定位共四种:static,fixed,relativ ...