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

Joh*_*ing 3 c++ function-pointers

假设我有这门课:

class Shape
{
public:
    int value;

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

    void draw()
    {
        cout << "Drawn the element with id: " << value << endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

和以下代码(有效)

    Shape *myShapeObject = new Shape(22);

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

    (myShapeObject ->*drawpntr)();
Run Code Online (Sandbox Code Playgroud)

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

首先我想问一下:

drawpntr = &Shape::draw;
Run Code Online (Sandbox Code Playgroud)

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

我同意这条线

(myShapeObject->*drawpntr)();
Run Code Online (Sandbox Code Playgroud)

因为我明白我不能将函数指针解引用成员函数(没有对象 - >没有函数),但实际存储在drawpntr中的地址是什么?这个时候没有任何对象

drawpntr = &Shape::draw;
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 8

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