//整理之,分享之,欢迎指正。for_wind
1、nonstatic member functions
其至少和一般的nonmember function 有相同的效率。编译器内部已将“member函数实体”转换为对等“nonmemer函数实体”。
转换步骤:
- 改写函数原型(signature),以安插额外参数this指针
- 改由this指针存取nonstatic data member;
- name mangling处理函数名称成独一的外部函数名,以及进行name return value的优化
2、virtual member functions
调用的两种方式:
1)经由一个class object调用一个virtual function,编译器将其视为一般的nonstatic member function进行resolved。
1)经由一个class object调用一个virtual function,编译器将其视为一般的nonstatic member function进行resolved。
2)
经由指针或引用调用,通过vptr,指向virtual table,通过其内的索引值,关联到该虚函数。
执行期多态:
以一个public base class的指针(或引用),寻址出一个derived class object。
具体:
准备工作:安插vptr指向该表格;给每一个virtual function指派一个表格索引值。
执行期任务:在特定的virtual table slot中“激活”virtual function。
一个class只会有一个virtual table。每一个table内含有其对应的class object中
所有active virtual functions函数实体的地址。
这些
active virtual functions包括:
(1)这个class 所定义的函数实体,改写(overriding)一个可能存在的base class virtual function函数实体。
(2)
继承base class 的函数实体。
(3)
pure_virtual_called()函数实体。(表示pure virtual function,或有时当作执行期异常处理函数)
多重继承下的virtual functions
其复杂度在于第二个及后继的base class 身上,以及“必须在执行期调整this指针”。
调整方法:thunk技术,address points技术(微软)
虚拟继承下的virtual functions
建议:不要在一个virtual base class 中申明nonstatic data members。因为太过复杂。
3、static member function
其主要特性:
没有this指针
相关次要特性:
- 不能够直接存取其class 中的 nonstatic members
- 不能够被申明为const, volatile 或virtual
- 不需要经由class object才被调用,虽然经常这样用。
取一个static member function的地址,获得是其在内存中的位置,其地址类型是一个nonmember函数的指针
注:this指针把“在member function存取的nonstatic class member”绑定于“object内对应的member”上。
参考资料及推荐资料: