C++中类成员函数指针的静态vector是否为真实指针?
类成员函数指针相关疑问解答
问题背景
你定义了类成员函数指针的别名:
typedef int (ClassA::*FunctionPointerType) (bool buy, const QVector<int>& varIdV);
并在类头文件中声明了该类型的静态容器:
static vector<FunctionPointerType> m_functionPointerV;
使用过程正常,但有两个疑问:
- 这个vector真的是存储指针的容器吗?毕竟创建vector时还没有类对象存在。
- 类成员函数指针不指向内存中的某个具体位置,它是真实指针,还是对象内存的偏移量?
解答
1. 这确实是存储成员函数指针的vector
FunctionPointerType是标准的类非静态成员函数指针类型,所以vector<FunctionPointerType>就是专门存储这类指针的容器。
创建静态vector时不需要存在ClassA对象完全合理——成员函数指针本身并不绑定到具体对象,它只记录“如何定位到类的某个成员函数”的信息,只有在调用这个指针指向的函数时,才需要传入具体的ClassA对象实例(比如通过(obj.*funcPtr)(true, varV)或(obj->*funcPtr)(true, varV)的形式)。
2. 类成员函数指针的本质
普通非成员函数指针直接指向函数在内存中的绝对地址,但类非静态成员函数指针的实现逻辑完全不同:
- 对于非虚成员函数:它本质上是相对于类对象起始地址的偏移量(还会附带一些类型校验信息)。因为类的非虚成员函数的地址在编译阶段就已确定,调用时只要拿到对象的起始地址,加上这个偏移量就能找到函数入口。
- 对于虚成员函数:结构会更复杂,通常包含能定位到虚函数表(vtable)对应位置的信息,但同样不需要依赖具体对象存在。
另外补充一点:你提到的“可通过对象访问的类静态数据成员指针”其实是普通指针——静态数据成员本身存放在全局内存区域,指向它的指针直接对应内存中的实际地址,和类对象没有关联;只有非静态成员的指针才是上述的偏移量/特殊结构。
内容的提问来源于stack exchange,提问作者Daniel Pol
相关产品推荐
相关产品推荐

