关于Delphi的构造函数为虚函数问题 ( 积分: 200 )

呵呵,高人不少呀。
 
//来自:SS2000, 时间:2005-4-29 21:08:44, ID:3061191
//呵呵,这种方法和所讨论的虚构造是两回事
呵呵.我所提到的观点在C++教材里是有论述的,并且我认为是已经理解的.

//来自:SS2000, 时间:2005-4-29 21:13:03, ID:3061194
//虚构造函数是语言本事支持的,C++不支持这种语法,用自己的方法实现语言(编译器)
不支持的功能,是很难很麻烦的。
这种做法我不喜欢,我不晓得居然自己要实现编译器所不支持的功能,怎么做?有意义吗?

你在构造函数当中需要做什么?内存管理/初始化,如此而已.
需要的是功能,不是死板的概念.
 
提出我的几点愚见:
1。C++不允许构造函数为虚函数?
因为C++编译器有了一个默认的构造函数,如果派生类自己定义了的构造函数(重写默认构造函数),那么编译器当然是调用重写的构造函数。delphi编译器没有这个所谓的默认构造函数。
2。delphi中的内存分配是由编译器魔法完成的内存分配,构造函数也只是完成数据成员的初始化。
详情请参见《delphi高手突破》P10-P18
 
>>来自:xeen, 时间:2005-4-29 16:23:21, ID:3060912
>>C++没有 class reference, Delphi里有。通过 class reference 调用构造函数
>>可以实现构造多态。
to zjan521,其实xeen高人说的很清楚了,Delphi的虚构造函数实现构造多态,而你说
的那种方法我确实不敢苟同为就实现了构造多态,但C++确实有方法实现构造多态,也
就是实现编译器不支持的功能,但确实不是你说的那种方法。

>>来自:fisker, 时间:2005-5-7 8:53:40, ID:3065944
>>delphi编译器没有这个所谓的默认构造函数。
其实delphi的默认构造函数就是TObject.Create,和C++的默认构造函数一样,什么
事情也不作,呵呵
 
>>你在构造函数当中需要做什么?内存管理/初始化,如此而已.
>>需要的是功能,不是死板的概念.
申明一点,此乃纯技术探讨,从实际效果看,zjan521的方法基本可以实现我这里说的
构造多态的功能,但是从技术角度说,zjan521的方法和构造多态确实是两回事。
其实Delphi确实在VCL中使用了多态构造,大家研究一下TComponent的Create函数
为什么定义为virtual就清楚了,TComponent可是几乎所有VCL的基类(基类的基类)。
 
>>来自:SS2000, 时间:2005-5-9 16:22:31, ID:3068160
>>申明一点,此乃纯技术探讨
其实在我的观点,应该称为纯学术讨论为宜.

而我所说的观点,恰恰是讨论技术问题.在Bj???,就是C++之父所编著的C++教材当中,有一节专门讨论到了这个问题.读完这本书,使我对于C++的了解相对加深了许多。C++是一门工业语言,他的很多设计特点都是有其实际考量的.
 
呵呵,C++是一门工业语言,这个说法挺有意思,不知“工业”二字如何理解?
如果你要认为你的你的方法就是多态构造,我也不说什么了。
我只是说C++没有虚拟构造函数,所以不能实现语法上的多态构造。
普通多态和构造多态是有区别的。
顺便说一句,我用C++的时间比Delphi时间多。
 
由于C++的类实例既可以在堆中实现,也可以在栈中实现,所以,我想这是C++不支持
构造多态的重要原因吧,其实在栈中实现的类对象,也不能实现普通多态,但是这个
设计特点确实有其实际考量的。
Delphi的类对象只能在堆中实现。
 
hehe,看这个:
http://www.c-view.org/journal/006/vcl_chong.htm
另外C++中用宏来解决这个问题:
DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE
 
xeen,你就是虫虫?
厉害,呵呵居然这么干,实现语言(编译器)不支持的功能,够狠的。
Scott Meyers的Virtualizing constructors and non-member functions一节
说实在的,也就看了,没有仔细研究,呵呵。好像不是你那么干的吧?
 
以前有过讨论
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1177659
 
左大侠真是刻苦勤奋之人。
惭愧这10多年,只顾编代码,都很少仔细系统研究学习,光钻研和自己有关的
东西了,特别是Delphi,用的挺爽,就是没有仔细深入的研究。
不错,C++没有虚函数,确实是因为象xeen所说“C++没有 class reference, Delphi里有”,这是跟本的原因。看来没必要在讨论下去了。
看到左大侠有一个私人论坛,很想加入一起提高,我做C++程序已经有10多年了,多少
还有点经验,不知左大侠可接纳否。
 
不过最近1,2年估计还会以Delphi为主,用Delphi开发程序确实很爽,没办法,我自己
做程序,用VC效率太低了,算算用Delphi也有6,7年了,Delphi确实挺好,但是一直
没有放下C++,有空的时候,就翻翻C++方面的书,C++确实是博大精深,不了解C/C++,
只了解Delphi,确实很难成为真正的高手。
 
言重了,请给我你的email地址
 
无言,编程学的是思想,而不是那种表示语言。
 
我的email ccwtt@163.com
 
已发信,请查收
 
同意ldg226,搞的太过份了有点钻牛角尖的感觉。
 
//来自:SS2000, 时间:2005-5-11 9:13:15, ID:3069861
//呵呵,C++是一门工业语言,这个说法挺有意思,不知“工业”二字如何理解?
呵呵,不好意思,这个所谓的工业语言的确不是引经据典,我的意思是它是那种贴近底层,贴近效率,贴近灵活...,所以他的设计较少的有编译时的甜点,一切都是如此的清晰而确定.
//如果你要认为你的你的方法就是多态构造
我自然不会如此混淆概念,我只是说可以如此完成所需的功能.

对于用得很少,一个语言本身不支持,同时又有很简洁的替代方案的咚咚,真的有必要大动干戈,去实现"编译器之外的概念"吗?C++用途如此之广泛,编译器就有多少种,操作系统又有多少种,兼容性就是个问题.我们需要尽可能地为改变作准备,又何必自己给自己添加额外的负担呢.
 
这个问题好像以前讨论过, Delphi技术手册上也有描述, 可以参考
 
顶部