static member functions不能直接存取nonstatic数据,不能被声明为const
nonstatic member function至少必须和一般的nonmember function有相同的效率,这是因为编译器内部已将”member函数实例“转换为对等的”nonmember函数实例“
转换步骤:
1.改写函数的signature(译注:意指函数原型)以安插一个额外的参数到member function中,用以提供一个存取管道,使class object得以将此函数调用。该额外参数被称为this指针
2.将每一个”对nonstatic data member的存取操作“改为经由this指针来存取
3.将member function重新写成一个外部函数。将函数名称经过”mangling“处理,使它在程序中成为独一无二的词汇
member的名称前面加上class名称,再加上它们的参数链表(可以从函数原型参考得到),制造出独一无二的结果
virtual member function的调用会被转化为对编译期产生的指向virtual table的指针vptr的访问;并通过索引确定virtual table slot的位置;和非静态成员函数类似,也为其安插一个this指针
在引入static member functions之前使用
((class*)0)->member function();//将0强制转换为一个class指针,因而提供一个this指针实例
Static member functions的主要特性就是它没有this指针,下面的特性都是根源于其主要特性:
1.它不能够直接存取其class中的nonstatic members
2.它不能够被声明为const,volatile,virtual
3.不需要经由class object才被调用
foo().static_member_function();
//会被转换为
(void)foo();//仍需要评估求值 class::static_member_function();
取一个static member function的地址,指针类型是”nonmember函数指针“
多态(Polymorphism)表示”以一个public base class的指针(或reference),寻址出一个derived class object“的意思
识别一个class是否支持多态,唯一适当的方法就是看它是否有任何virtual function。只要class拥有一个virtual function,它就需要一份额外的执行期信息(runtime type identification)
在执行期调用正确的virtual function实例,需要知道:
1.ptr所指对象的真实类型。这可使我们选择正确的virtual function实例(一个字符串或数字,表示class的类型)
2.virtual function实例的位置,以便能够调用它(一个指针,指向某表格,表格中持有程序的virtual functions的执行期地址,地址和地址指向的表格在执行期都是固定不变的)
为了找到函数地址,每个virtual function被指派一个表格索引值
一个class只会有一个virtual table。每一个table内含其对应之class object中所有active virtual functions函数实例的地址:
1.这一class所定义的函数实例。它会改写一个可能存在的base class virtual function函数实例
2.继承自base class的函数实例。这是在derived class决定不改写virtual function时才会出现的情况
3.一个pure_virtual_called()函数实例,它既可以扮演pure virtual function的空间保卫者角色,也可以当作执行期异常处理函数
单一继承的三种可能性:
从上面可以看到, 单继承下的虚函数效率高, 实现简单, 但是多继承和虚拟继承则要复杂很多
深度探索C++对象模型 个人总结 第四章 Function语意学
原文:https://www.cnblogs.com/GodZhuan/p/14191160.html