关于C++/Delphi比较的问题(一)_光明网(组图)

我最后一次回答这个问题是在 2002 年左右,在 delphibbs.com,它应该是当年 C++/Delphi 比较中最热门的问题之一。

首先,C++ 不支持虚拟构造函数,而 Delphi 支持。

关于为什么 C++ 不支持虚构造函数,Bjarne 很久以前在 C++ Style and Technique FAQ 中回答过:

虚拟调用是一种在给定部分信息的情况下完成工作的机制。特别是,“虚拟”允许我们调用只知道接口而不知道对象的确切类型的函数。要创建一个对象,您需要完整的信息。特别是,您需要知道要创建的确切类型。因此,“对构造函数的调用”不能是虚拟的。

来源:Stroustrup:C++ 风格和技术常见问题解答

大意是虚函数调用只需要“部分”信息,即只需要知道函数接口,而不需要知道对象的具体类型。但是要构造一个对象,就必须知道具体的类型信息。如果调用虚构造函数,编译器怎么知道要构造继承树上的哪个类型呢?所以这在逻辑上是一个悖论。

Bjarne提出的解决方案是factorypattern构造方法没有返回类型,就是为每个要构建的类型创建一个对应的工厂,把问题放到工厂的make方法中来解决。这也是 C++ 中的通用解决方案。

顺便说一句构造方法没有返回类型,这个常见问题解答一直在维护和更新,但至少在我在 2002 年翻译这个常见问题解答之前,这个答案一直存在。

那么为什么 Delphi 支持虚拟构造函数呢?Delphi 有一种存储类元数据的类型。TClass 是所有自定义类类型(不是自定义类型)的祖先类。在构造一个新对象的时候,实际上是调用了TClass的一个子类(即自定义类类型)的虚Create方法,而这个子类存储了相关类的元数据,从而避免了“虚构造函数不知道具体类型”。信息”问题。这可以看作是工厂模式的通用实现,它在语言级别非常优雅和完美地解决了这个问题。

这个问题可以再引申出两个问题,我已经在知乎讨论过:

为什么 C++ 不支持类类型,或者为什么 C++ 不支持更丰富的 RTTI 特性?

C/C++中有没有类似的技术可以实现反射、内省和代理?——左庆侯的回答

虚拟构造函数有什么意义(尤其是在可视化组件技术中)?

VCL 比 MFC 好在哪里?——左庆侯的回答

当程序员足够大时,他会从工程师变成历史学家。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论