指向成员函数的C ++函数指针 - 它接收哪个地址?

时间:2012-10-07 00:59:20

标签: c++ function-pointers

假设我有这门课程:

class Shape
{
public:
    int value;

    Shape(int v) : value(v) {};

    void draw()
    {
        cout << "Drawn the element with id: " << value << endl;
    }
};

和以下代码(有效)

    Shape *myShapeObject = new Shape(22);

    void (Shape::*drawpntr)();
    drawpntr = &Shape::draw;

    (myShapeObject ->*drawpntr)();

我有一个drawpntr函数指针,指向类Shape的void-returns 0-arguments函数成员。

首先我想问一下:

drawpntr = &Shape::draw;

该函数是一个成员函数,这里没有对象.. drawpntr接收什么地址?该课程甚至不应该存在

我同意这一行

(myShapeObject->*drawpntr)();

因为我理解我不能将函数指针解引用成员函数(没有对象 - >没有函数),但是什么地址实际存储在drawpntr中?

时没有任何对象
drawpntr = &Shape::draw;

行被调用..并且该类不应该作为实体存在

1 个答案:

答案 0 :(得分:8)

所有成员函数共享相同的代码,因此它们在内存的代码段中具有相同的地址。成员函数仅在不同的实例上运行,因为它们隐式传递了this指针的不同值。它们不以任何方式与它们运行的​​任何实例相关联。如果函数是非虚函数,则可以静态确定drawpntr的实际值,如果函数是虚函数,则可以动态地(通过vtable确定)。