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

问题描述 投票:0回答:1

在下面的示例中,我真的很难理解函数指针与成员函数的调用。

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

我想知道替换的代码(因为我知道当这些成员函数是虚拟和非虚拟时,编译器将这两个函数调用的函数调用(如 obj.Fun() 替换为 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;
}

谢谢

c++ function-pointers
1个回答
1
投票

您的代码显示未定义的行为,这意味着编译器可以做任何它喜欢的事情,包括您(错误地)期望它做什么。

© www.soinside.com 2019 - 2024. All rights reserved.