起因,看tamarian的代码,其中有一段注释:
/**
* ScriptBufferImpl is the base class for script buffer
* implementations.
*
* This is a pure base class which must be subclassed to be used.
* Its methods are not virtual for performance reasons.
* For default script buffer behavior, use BasicScriptBufferImpl.
*/
其中说到这里的ScriptBufferImple是一个只用来被继承的纯虚函数,但是为了效率问题,它的实现没有使用virtual。
我就产生了疑问,virtual确实会有一定的开销,因为如果是virtual函数,那么所有的调用就需要从基类的vtable中去寻找,从而带来一些性能损失。
接着,google了一下, 发现c++/C#及java的阵营做法不一样,参见http://stackoverflow.com/questions/814934/why-c-sharp-implements-methods-as-non-virtual-by-default
里面讨论两者的出发点。 发现JAVA由于有VM的存在,可以动态的做一些优化,从而对于virtual的效率没有那么care。