码迷,mamicode.com
首页 > 其他好文 > 详细

第四章:指向成员函数的指针

时间:2021-06-24 18:18:01      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:作用   rto   rgba   rup   add   soft   virt   int   情况下   

 

  1.指向作用域运算符(书里叫成员选择运算符)"::"的指针的作用是保存this指针。所以静态成员函数指针(没有this)的类型是函数指针,而不是成员函数的指针。

  2.指向成员函数的指针有两种功能:①调用普通的成员函数②调用虚成员函数

  对前者取地址得到的是该函数在内存中的真实地址,而后者取地址得到的是虚函数在虚函数表中的索引值。所以一个成员函数指针必须能分辨指向的是上述哪两种地址,在cfront2.0中的解决办法如下:

float (Point::*pmf)();
Point *ptr;
//判断是哪种情况
(((int)pmf) &~127)       //pmf如果是索引且最大索引小于127则被置为0
?      
(*pmf)(ptr)     // 非虚函数
:
(*ptr->vptr[(int)pmf](ptr)); //虚函数        

  上述判断需要一定的开销。

  3.多重继承和虚拟继承情况下的指向成员函数的指针

  (1)Stroustrup提出了以下结构来支持多重继承和虚拟继承的成员函数指针。

struct _mptr{
int delata //表示可能的this指针调整值
int index;  //虚函数表的索引值,-1表示非虚函数
union {
ptrtofunc faddr; //非虚函数的地址
int          v_offset; //放置第二个或后继继承链中虚基类的虚函数表的位置,如果vptr放在类对象的开头处则不必要但是会降低对C结构的兼容性
};};

  此模型下需要改正2中所提到的判断。这个判断会导致指向非虚函数的指针也增加判断这一条件,并且当传递一个不变指针给成员函数时,他需要产生一个临时对象(因为要配置上述这个结构体,普通情况下直接产生一个临时指针即可)

(pmf.index<0)
?(*pmf.faddr)(ptr)    //非虚函数
:(*ptr->vptr[pmf.index](ptr)); //虚函数  

  (2)为了减少对指向非虚成员函数指针判断所带来的成本,Microsoft取消判断,导入一个vcall thunk。此策略下,faddr被指定要不就是真正的member function地址,要不就是vcall thunk地址。vcall thunk会选出并调用相关virtual table中的slot。

第四章:指向成员函数的指针

标签:作用   rto   rgba   rup   add   soft   virt   int   情况下   

原文地址:https://www.cnblogs.com/wildricky/p/14926377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!