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

标签 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 的返回 0 参数的空值函数成员。

我想问的第一件事:

drawpntr = &Shape::draw;

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

我同意这条线

(myShapeObject->*drawpntr)();

因为我知道我不能解除对成员函数的函数指针的引用(无对象 -> 无函数),但实际存储在 drawpntr 中的地址是什么?

drawpntr = &Shape::draw;

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

最佳答案

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

关于指向成员函数的 C++ 函数指针 - 它接收哪个地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12765228/

相关文章:

c++ - 在对std::filesystem::canonical()或std::filesystem::weakly_canonical()的调用上,lexically_normal()是否冗余?

c++ - 如何在 OSX 上的 Carbon 文本字段中设置文本?

c++ - 将可执行文件链接到共享库

c++ - 指向成员函数的指针 vector

c++ - 最快的语音识别库 C++

C++问题。关于类的容器和实例

objective-c - 在 Objective C 中,什么相当于在 C 中传递函数指针?

c++ - 指向同一个函数的两个函数指针总是相等的吗?

c - 包含函数指针的结构,其自身作为 C 中的返回类型

c - 如何设置通过参数传递给函数的 int 值并将其分配给全局,以便我可以在函数外部使用?