假设我有这门课程:
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;
行被调用..并且该类不应该作为实体存在
答案 0 :(得分:8)
所有成员函数共享相同的代码,因此它们在内存的代码段中具有相同的地址。成员函数仅在不同的实例上运行,因为它们隐式传递了this
指针的不同值。它们不以任何方式与它们运行的任何实例相关联。如果函数是非虚函数,则可以静态确定drawpntr
的实际值,如果函数是虚函数,则可以动态地(通过vtable确定)。