由编译器代替成员函数的函数指针的代码

问题描述:

在下面的例子中,我很难理解函数指针对成员函数的调用。由编译器代替成员函数的函数指针的代码

(f.*(FPTR) bp)(0); // This call b() 
(b.*(BPTR) fp)(0); // This call f() 

我想知道的代码替换(因为我知道一个函数调用像obj.Fun()被替换为乐(& OBJ)编译器为这两个函数调用时,这些成员函数是虚拟和非虚拟 谁能帮助我了解,请

我想了解更多这样的链接解释:?http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/

#include <iostream> 

using std::cout; 
using std::endl; 

class Foo 
{ 
public: 
    void f(int i = 0) 
    { 
     cout << "Foo" << endl; 

    } 
}; 

class Bar 
{ 
public: 
    void b(char c = 'b') 
    { 
     cout << "Bar" << endl; 
    } 
}; 


int main() 
{ 
    typedef void (Foo::*FPTR) (int); 
    typedef void (Bar::*BPTR) (char); 

    FPTR fp = &Foo::f; 
    BPTR bp = &Bar::b; 

    Foo f; 
    Bar b; 

    /* 
    * we are casting pointer to non-compatible type here 
    * Code works, but want to know how it is. 
    */ 
    (f.*(FPTR) bp)(0); 
    (b.*(BPTR) fp)(0); 


    return 0; 
} 

感谢

+3

_I想知道编译器为这两个函数调用生成的代码_和..你不能编译成汇编,并寻找自己,因为......? –

+0

我不是说汇编代码。我对时尚感兴趣。像obj.Fun()被Fun(&obj) –

+3

取代你的无效投射产生UB。 – Jarod42

你的代码显示undefined behaviour,这意味着编译器可以做任何它喜欢的,包括你(错误地)期望它做。