读书人

请问:关于成员函数指针地址调整不解

发布时间: 2012-03-25 20:55:17 作者: rapoo

请教:关于成员函数指针地址调整不解

C/C++ code
class B1 {private:    int b1;public:    void mf1();};void B1::mf1() {    std::cout << "b1=" << b1 << std::endl;}class B2 {private:    int b2;public:    void mf2();};void B2::mf2() {    std::cout << "b2=" << std::endl;}class D : public B1, public B2 {private:    int d;};void (D::*pmf_a) () = &D::mf2; // 地址调整为+4void (B2::*pmf_b) () = (void (B2::*) () )pmf_a; // 又变回原来的地址即地址调整为0


我不解的就是void (B2::*pmf_b) () = (void (B2::*) () )pmf_a; // 又变回原来的地址即地址调整为0
void (B2::*) ()是B2成员函数指针,它指向一个void类型,(void (B2::*) () )pmf_a又是什么?为什么又变回原来的地址了?

[解决办法]
函数指针从派生类转换成基类的, 而派生类本身有个int
[解决办法]
为什么我测试时,pmf_a 和 pmf_b地址都一样
[解决办法]
D类的函数成员指针应该是由两部分组成:1。函数入口地址。2。基类偏移量。
通过成员指针调用时,要有一个this指针修正(因为可能是基类的成员函数,所以要让This指针修正为为基类的指针)。以上说法基于Vs2010的实现。
[解决办法]
这个问题,你要清楚D类的对象模型
(void (B2::*) () )pmf_a
这个只是一个类型转换,成员函数指针的类型转换

[解决办法]
不要将成员函数指针这样的结构和普通的函数指针等同起来

读书人网 >C++

热点推荐