VCL里的构造函数
好奇,为什么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里的构造函数的更多相关文章
- WM_NCHITTEST有21种取值,常用的有HTCAPTION,HTCLIENT,HTBORDER,HTSYSMENU,HTTRANSPARENT,罗列所有VCL里对其使用的情况
我为了移动一个无标题栏的窗体,使用了WM_NCHITTEST消息,这个消息大概如下: 通常,我们拖动对话框窗口的标题栏来移动窗口,但有时候,我们想通过鼠标在客户区上拖动来移动窗口. 一个容易想到的方案 ...
- Java里的构造函数(构造方法)
构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型 ...
- VCL里为什么要用类函数代替API,为什么要用CM_消息代替虚函数
之所以要用类函数代替API,是因为VCL对它做了一些包装,好在API起作用之前和之后做一些额外的事情:通知和判断等等.之所以类函数要包装一个CM_消息,是因为这样方便程序员(在调用类函数的基础上)截断 ...
- Autowired注解的妙用---在Controller里的构造函数里获取需要注入的对象
/*@Resource private Observer<TaxiObserverVo> taxiPushObserver; @Resource private Observer<T ...
- 研究一下FBrush,它是从TWinControl才有的属性(可能是因为需要句柄)——发现{$R *.dfm}在运行期执行,而且很有深意,读到属性后赋值还会触发事件,这些无法在VCL代码里直接看到
定义和创建: TWinControl = class(TControl) private FBrush: TBrush; end; constructor TWinControl.Create(AOw ...
- 让VCL的皮肤用在手机程序里 让安桌程序不山寨[转]
① 就用那个bitmap设计工具,先打开vcl里的皮肤(..... \Embarcadero\RAD Studio\12.0\Redist\styles\vcl里) ② save as 转换 ...
- javascript --- 设计模式之构造函数模式
在JavaScript里,构造函数通常是认为用来实现实例的,JavaScript没有类的概念,但是有特殊的构造函数.通过new关键字来调用定义的否早函数,你可以告诉JavaScript你要创建一个新对 ...
- 转:C++编程隐蔽错误:error C2533: 构造函数不能有返回类型
C++编程隐蔽错误:error C2533: 构造函数不能有返回类型 今天在编写类的时候,出现的错误. 提示一个类的构造函数不能够有返回类型.在cpp文件里,该构造函数定义处并没有返回类型.在头文件里 ...
- JavaScript设计模式之构造函数模式
一.构造函数模式概念 构造函数用于创建特定类型的对象——不仅声明了使用过的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象 ...
随机推荐
- http协议相关面试题
浏览器输入url按回车背后经历了哪些? 1.在PC浏览器的地址栏输入一串URL,然后按Enter键这个页面渲染出来,这个过程中都发生了什么事? 1.首先,在浏览器地址栏中输入url,先解析url,检测 ...
- 无密码登录Linux
配置主机A无密码登录主机B 主机A:192.168.1.110 主机B:192.168.1.111 先确保所有主机的防火墙处于关闭状态. 在主机A上执行如下: 1. $cd ~/.ssh 2. $ss ...
- Yii初学者必看(转载)
Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术. 每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示 ...
- TStringList,快速解析 查找测试。。。很有用,再也不用 FOR 循环了
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABKAAAALHCAIAAAA2Gq0zAAAgAElEQVR4nOydeVgUV76wK5OZb5JJZi
- Win10下 tensorflow gpu版安装
准备: 系统环境: windows10 + Anaconda3 + Pycharm (1)环境配置: 打开Anaconda Prompt,输入清华仓库镜像,这样更新会快一些: 输入: conda co ...
- Java 基础【05】你的多继承纳?
Java省略了许多很少用到,缺乏了解,混淆功能的C + +,在我们的经验中带来更多的悲伤大于收益 . -----James Gosling James Gosling 这个人大家应该很熟悉,就是最初设 ...
- Widows下利用OpenSSL生成证书
1.下载OpenSSL的windows版本 32位:openssl-1.0.2a-i386-win32.zip 64位:openssl-1.0.2a-x64_86-win64.zip 下载之后解压即可 ...
- 同源策略Same-origin policy
同源策略Same-origin policy 同源策略Same-origin policy是Web应用的一种安全基础策略.它规定同一源中,页面包含的脚本可以访问该源下的其他页面的数据.只有当网址中的 ...
- linux几种常见的文件内容查找和替换命令
作为一个以前没怎么接触过linux的小白,开始使用linux,各种不习惯,这周遇到一个文件内容测查找和替换的需求.学习了以下几种实现方式: 1.vi命令下的查找和替换 1.1 vi下的查找 /patt ...
- 【Unity3D自学记录】Unity3D之自制小钟表
今天来写一个小钟表,事实上非常easy,就运用到了欧拉角. 首先创建时钟.分钟.秒钟以及4个点(12点.3点.6点.9点)偷懒了~~没弄那么多点. 时钟.分钟.秒钟这三个父级的中心一定要注意,我们旋转 ...