为什么需要虚函数
在这个问题上,我们可能会问:“如果这个技术如此重要,并且能使得任何时候都能调用
‘正确’的函数。那么为什么它是可选的呢?为什么我还需要知道它呢?”
问得好。回答关系到C + +的基本哲学:“因为它不是相当高效率的”。从前面的汇编语言输
出可以看出,它并不是对于绝对地址的一个简单的C A L L,而是为设置虚函数调用需要多于两
条复杂的汇编指令。这既需要代码空间,又需要执行时间。一些面向对象的语言已经接受了这
种概念,即晚捆绑对于面向对象程序设计是性质所决定的,所以应当总是出现,它应当是不可
选的,而且用户不应当必须知道它。这是由创造语言时的设计决定,而这种特殊的方法对于许
多语言是合适的[ 1 ] 。C + +来自C传统,效率是重要的。创造C完全是为了代替汇编语言以实现
操作系统(从而改写操作系统—U n i x—使得比它的先驱更轻便)。希望有C + +的主要理由
之一是让C程序员效率更高[ 2 ]。C程序员遇到C + +时提出的第一个问题是“我将得到什么样的规
模和速度效果?”如果回答是“除了函数调用时需要有一点额外的开销外,一切皆好”,那么
许多人就会仍使用C,而不会改变到C + +。另外,内联函数是不可能的,因为虚函数必须有地
址放在V TA B L E中。所以虚函数是可选的,而且该语言的缺省是非虚拟的,这是最快的配置。
S t r o u s t r u p声明他的方针是“如果我们不用它,我们就不会为它花费”。
因此,v i r t u a l关键字可以改变程序的效率。然而,设计我们的类时,我们不应当为效率问
题而担心。如果我们想使用多态,就在每处使用虚函数。当我们试图加速我们的代码时,我们
只需寻找能让它非虚的函数(在其他方面通常有更大的好处)。
有些证据表明,进入C + +的规模和速度改进是在C的规模和速度的1 0 %之内,并且常常更
接近。能够得到更小的规模和更高速度的原因是因为C + +可以有比用C更快的方法设计程序,
而且设计的程序更小。