Nonstatic Member Functions(非静态成员函数)
C++的设计准则之一就是:nonstatic member function至少必须和一般的nonmember function有相同的效率。
名称的特殊处理(Name Mangling)一般而言,member的名称前面会被加上class名称,形成独一无二的命名。
Virtual Member Functions(虚拟成员函数)
( * ptr->vptr[1])( ptr )
Static Member Functions(静态成员函数)
virtual function的一般实现模型:每一个class有一个virtual table,内含该class之中有作用的virtual function的地址,然后每个object有一个vptr,指向virtual table的所在。
在C++中,多态(polymorphism)表示“以一个public base class 的指针(或reference),寻址出一个derived class object”的意思。
C++对“积极多态(active polymorphism)”的唯一支持,就是对于virtual function call的决议(resolution)操作。有了RTTI,就能够在执行期查询一个多态的pointer或多态的reference了。
欲鉴定哪些 classes 展现多态特性,我们需要额外的执行期信息。一如我所说,关键词class和struct并不能够帮助我们。由于没有导入像是polymorphic之类的新关键词,因此识别一个class是否支持多态,唯一适当的方法就是看看它是否有任何virtual function。只要class拥有一个virtual function,它就需要这份额外的执行期信息。
在实现上,首先我可以在每一个多态的class object身上增加两个members:
然而,执行期备妥那些函数地址,只是解答的一半而已。另一半解答是找到那些地址。两个步骤可以完成这项任务:
这些工作都由编译器完成。执行期要做的,只是在特定的virtual table slot(记录着virtual function的地址)中激活virtual function。
一个class只会有一个virtual table。每一个table内含其对应之class object中所有active virtual functions函数实例的地址。这些active virtual functions包括:

现在,如果我有这样的式子:ptr->z()
我如何有足够的知识在编译时期设定virtual function的调用呢?
在多重继承中支持virtual functions,其复杂度围绕在第二个及后继的base classes身上,以及“必须在执行期调整this指针”这一点。


虚拟继承中,虚基在派生类中也存在虚指针,存在多个虚函数表,更复杂。
nonmember、static member或nonstatic member函数都被转化为完全相同的形式。所以我们毫不惊讶地看到三者的效率完全相同
使用一个“member function指针”,如果并不用于virtual function、多重继承、virtual base class等情况的话,并不会比使用一个“nonmember function指针”的成本更高。
对一个nonstatic member function取其地址,将获得该函数在内存中的地址。然而面对一个virtual function,其地址在编译时期是未知的,所能知道的仅是virtual function在其相关之virtual table中的索引值。也就是说,对一个virtual member function取其地址,所能获得的只是一个索引值。
关键词inline只是一项请求。如果这项请求被接受,编译器就必须认为它可以用一个表达式(expression)合理地将这个函数扩展开来。
一般而言,处理一个inline函数,有两个阶段:
形式参数(Formal Arguments)
每一个形式参数都会被对应的实际参数取代。如果说有什么副作用,那就是不可以只是简单地一一封塞程序中出现的每一个形式参数,因为这将导致对于实际参数的多次求值操作(evaluations),所以可能会引入临时变量。

局部变量(Local Variables)
一般而言,inline函数中的每一个局部变量都必须被放在函数调用的一个封闭区段中,拥有一个独一无二的名称。如果inline函数以单一表达式(expression)扩展多次,则每次扩展都需要自己的一组局部变量。如果inline函数以分离的多个式子(discrete statements)被扩展多次,那么只需一组局部变量,就可以重复使用(译注:因为它们被放在一个封闭区段中,有自己的scope)。
然而一个inline函数如果被调用太多次的话,会产生大量的扩展码,使程序大小暴涨。