分类: C/C++
2008-05-21 17:00:14
观点一:万一class设计者没有辨识出应该成为虚函数的函数,derived class设计者就没有办法改写这个必要的函数了。所以,应该将所有的member function都声明为虚函数。
观点二:虚函数比非虚函数缺乏效率。由于它们没办法做成inline函数(inline函数的行为发生于编译时期,虚函数在执行时期获得解析),因此,可能成为程序缺乏效率的罪魁祸首,特别是哪些小小的、常被调用的“与类型无关”的函数。
很可能class设计者会预料某些函数将来会有不同的行为,并于derived classes中被改写(overridden)。如果base class设计者无法认知这样的需要,derived class设计者就像画一艘无浆的船一样,因为他没有虚拟函数可用(可改写),但是一旦class拥有一个虚函数,该class的每一个对象都将有一个虚拟指针(vptr)指向一个虚拟表格(vtbl),其中内含该class的所有虚拟函数地址(每个对象有一个vptr,每个class有一个vtbl)。因此,让所有member functions都成为虚函数,可能会影响效率,因为所有member fucntions都需付出动态分配(dynamic dispatch)的成本,另一个重点是,虚函数无法inlined。所以,基于效率因素,只有在某些函数必须是vitrual时,我们才将他声明为virtual,而其结果就是它可以再derived classes中被改写(overridden)。