首页 > 代码库 > C++虚函数的缺陷
C++虚函数的缺陷
MFC中的消息机制没有采用C++中的虚函数机制,原因是消息太多,虚函数内存开销太大。在Qt中也没有采用C++中的虚函数机制,原因与此相同,其实这里还有更深层次上的原因,大体说来,多态的底层实现机制只有两种:
1. 一种是按照名称查表
2. 一种是按照位置查表
两种方式各有利弊,而C++的虚函数机制无条件的采用了后者,导致的问题就是在子类很少重载基类实现的时候开销太大,再加上象界面编程这样子类众多的情况,基本上C++的虚函数机制就废掉了,于是各家库的编写者就只好自谋生路了,说到底,这确实是C++语言本身的缺陷。
参考:http://blog.csdn.net/oowgsoo/article/details/1529411
----------------------------------------------------------------------------------
感叹一句,还真的是自谋生路啊,而且是不约而同的,Delphi就采用了dynamic机制,以减小子类的内存开销,而且大多数是不必要的虚函数开销。
在这些方法里:
1. VC++使用一组结构体的宏定义来实现消息映射,从而解决虚函数的缺陷。
2. Qt的信号槽机制其实就是按照名称查表。
3. Delphi则通过dynamic机制从编译器的角度来解决这个问题。这些方法里,自然是Delphi的方法最简洁方便。
----------------------------------------------------------------------------------
以前一直不明白为什么说Delphi语法优美,现在有2点体会,好像是这么回事:
1. C++的宏定义表面上是个好东西,也确实是个好东西,因为可以做无穷无尽的扩展,但用它就会把源代码搞的很复杂,你完全都不知道编译器/类库会把你的源代码替换成什么东西。VC++就是靠这套方法实现消息机制的,QT更夸张,每个文件都要生成moc文件才能真正进行编译。而Delphi的源代码就是源代码,对所有人/所有库都平等,没有什么隐晦的代码。
2.
C++虚函数的缺陷