3

假设我有这个类:

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;

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

4

1 回答 1

8

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

于 2012-10-07T01:06:15.777 回答