1. 首页
  2. 编程语言
  3. C++ 
  4. Second Edition

Second Edition

上传者: 2024-07-23 21:06:17上传 PDF文件 14.32MB 热度 7次

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

抽象基类和纯虚函数在所有的instrument的例子中,基类instrument中的函数总是“假”函数。如果调用这些函数,就会指出已经做错了什么事。这是因为,instrument的目的是对所有从它派生来的类创建公共接口,如在下面的图中看到的:虚线表示类(一个类只是一个描述,而不是一个物理实体—虚线代表了它的非物理的“性质”)。从派生类到基类的箭头表示继承关系。建立公共接口的唯一的理由是使得它能对于每个不同的子类有不同的表示。它建立一个基本的格式,由此可以知道什么是对于所有派生类公共的。注意,另外一种表达方法是称instrument为抽象基类(或简称为抽象类),当希望通过公共接口不同的实现【相关内容请见:虚基类虚函数与纯虚函数】。

下载地址
用户评论