请问:关于成员函数指针地址调整不解
请教:关于成员函数指针地址调整不解C/C++ codeclass B1 {private:int b1public:void mf1()}void B1::mf
请教:关于成员函数指针地址调整不解
C/C++ codeclass 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
这个只是一个类型转换,成员函数指针的类型转换
[解决办法]不要将成员函数指针这样的结构和普通的函数指针等同起来