考虑以下:
#include <iostream>
class A {
public:
virtual void foo(){ std::cout << "A::foo" << std::endl; }
void bar(){ std::cout << "A::bar" << std::endl; }
};
class B : public A {
public:
void foo(){ std::cout << "B::foo" << std::endl; }
void bar(){ std::cout << "B::bar" << std::endl; }
};
typedef void (A::*a_func_ptr)(void);
int main() {
a_func_ptr f = &A::foo;
a_func_ptr g = &A::bar;
B b;
A a;
(b.*f)();
(b.*g)();
(a.*f)();
(a.*g)();
}
输出:
B::foo
A::bar
A::foo
A::bar
两个成员指针都属于同一类型,但在每种情况下都正确路由了调用。
不知何故,生成的程序必须知道指向方法的指针实际上是简单方法还是虚拟方法。因此,方法指针的运行时表示必须包含更多信息来处理第二种情况。
备注:大小似乎取决于实现(我8
在我的系统上)。