通过对象调用成员函数

时间:2019-06-27 23:32:30

标签: c++ function member

我只是想了解这段代码背后的逻辑。当成员函数不属于对象时,编译器将如何调用该函数。编译器需要以某种方式知道要调用的函数的地址。它在哪里获取正确函数的地址。我知道这是一个愚蠢的问题,但很好奇地了解了此函数背后的内在真理

#include <iostream>
using namespace std;

class Base {
public:
    Base() {
        cout << "Base class constructor\n";
    }
    void Fun()
    {
        cout << sizeof(this) << endl;
        cout << "This is member function" ;
    }

    void Fun1()
    {
        cout << "This is second member fun" << endl;
    }
    int Val;
};

int main(int argc, char* argv[])
{
   Base Obj;
   cout << sizeof(Obj) << endl;
   Obj.Fun();
    return 0;

}

1 个答案:

答案 0 :(得分:1)

  

以某种方式,编译器需要知道要调用的函数的地址。

编译工具链负责选择函数的位置(为简单起见,让我们忽略动态链接和地址空间随机化)。这就是为什么工具链知道函数将在哪里。

例如,假设工具链选择将函数Base::Fun定位在地址0x008中。因此,当调用函数Base::Fun时,工具链会知道该调用必须位于地址0x008中。