-
name mangling(名称的特殊处理)
-
static member function
- 没有this指针
- 不能直接存取class中的nonstatic member
- 不能被声明为const、volatile或virtual
- 不需要经由class object才被调用---虽然大部分时候是被这样调用的
- 取static member function的地址,获得的是其在内存中的位置,由于static member function没有this指针,所以其
地址类型为nonmember函数指针,而不是一个指向class member function的指针
-
virtual member functions 虚拟成员函数
- 在C++中, 多态表示以一个public base class 的指针(或reference),寻址出一个derived class object的意思。
Point *ptr = new Point2d;
- 识别一个class是否支持多态,唯一适当的方法就是看看它是否有任何的virtual function,只要class拥有一个virtual function,它就需要这份额外的执行期信息。
- vbtl中slot从1开始
4. 一个class只会有一个virtual table,其中内含对应class object中所有的active virtual functions的函数实体的地址。这些active virtual functions包括:
一个class定义的函数实体。它会改写overriding一个可能存在的base class virtual function。
继承自base class的函数实体。此时该class不改写base class virtual function。
一个pure_virtual_called()函数实体,它既可以扮演pure virtual function的空间保卫者,也可以当作执行期异常处理函数。如果该函数被调用,通常的操作是结束程序。
每一个virtual function都被指派一个固定不变的索引值,该值在整个继承体系中保持与特定virtual function的关联。这样就可以在编译时期设定virtual function的调用。
多重继承下,一个上层basse classes数目为n的derived class,它将内含n-1个额外的virtual tables。其主要实体与最左端的base class共享,其中包含所有virtual functios的地址;n-1个次要实体与其它base classes有关,其中只包含出现在对应base class中virtual functions的地址。
在多重继承中支持virtual function,其复杂度围绕在第二个及后继base class上,以及执行期this指针调整上。第二(或后继)base class会影响对virtual function支持的3种情况:
- 通过指向第二个base class的指针,调用derived class virtual function;
- 通过指向derived class的指针,调用第二个base class中一个继承而来的virtual function;
- 允许virtual function函数的返回值类型有所变化,可能是base type,也可能是publicly derived type。
- 关于执行期this指针调整比较有效率的解决方法是thunk。所谓thunk是一小端assembly码,用来以适当的offset值来调整this指针并跳到相应的virtual function。thunk技术允许virtual table slot继续内含一个简单的指针,此时多重继承将不需要任何空间上的额外负担!slots中的地址可以直接指向virtual function,也可以指向一个相关的thunk。