成员函数指针:类成员函数指针是什么?



很多人对成员指针有无解,以为成员指针同普通指针区别不大,多了个参数.
然而实际上却不是.多了个参数,是不假,但他确实不是指针,虽说名字中有指针两个字,但实际上却不是指针.
先看看最简单使用

test
{
public:
void func{prf("call test::func\n");};
};


{
void(test::*p) = &test::func;
test x;
(x.*p);
}

这里使用方法是最常见跟普通指针使用地方也差不多般见到地方也差不多都这么用
但成员指针还有更好用地方看下面这个例子
base
{
public:
virtual void func{prf("call base::func\n");};
};
test:public base
{
public:
void func{prf("call test::func\n");};
};


{
void(base::*p) = &base::func;
test x;
(x.*p);//是test::func;
base y;
(y.*p);//是base::func;
}

从这个例子看,成员指针也可以使用多态看到这里是不是觉得成员指针跟的前想样?

紧接着上面例子只更改内容


{
void(base::*p) = &base::func;
prf("( void(base::*p)) %d\n" , (p) );
};


这里输出结果能想到么?(我系统是32位XP)
VC9 下是 4
GCC4.2.1 是 8
CodeGear C 6.10 结果是12
到这里是不是会想到如何得到成员地址呢?
我想到最简单办法就是输出map文件这样就直接找到对应地址
那运行时候如何得到呢?
答案是没有,
如果是虚则可以通过搜索虚表来得到不过这个思路方法太不通用也很难实际应用算是种理论上能但不能实际应用思路方法
非虚还不知道有什么好思路方法能够得到

Tags:  指向函数的指针 函数指针 类成员函数线程 成员函数指针

延伸阅读

最新评论

发表评论