假设我有这个类:
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/