下面的代码可以工作,但是我不太确定我理解为什么成员函数指针memfunc_ptr
最终指向正确的函数Derived::member_func()
(参见这里的示例)。我知道成员函数指针在对象的类中定义了偏移量,在本例中是类Base
。因此,为了证明代码获得的结果,即调用成员函数Derived::member_func
而不是Base::member_func
,我必须得出结论,该偏移量应用于Derived
类的虚值表,因为member_func()
是虚的,而对象d
属于Derived
类。明白了吗?
#include <iostream>
class Base {
public:
virtual void member_func() {
std::cout << "Base" << 'n'; };
};
class Derived : public Base {
public:
virtual void member_func() { std::cout << "Derived" << 'n'; };
};
int main() {
typedef void (Base::*MFP)();
MFP memfunc_ptr;
memfunc_ptr = &Base::member_func;
Derived d;
(d.*memfunc_ptr)();
}
member_func()
是虚函数。因此,编译器将始终针对所指向的对象的实际类型调用最合适的函数。确保这一点的方法是特定于实现的。
最常用的方法是使用虚函数表,即函数指针表。在构造对象期间初始化指向虚函数表的指针。每次引用这样的虚函数时,编译器都会生成代码来查找虚函数表中的函数指针(使用虚函数表中的偏移量)。当您使用指向虚函数的指针时,编译器将生成代码以在虚函数表中查找正确的指针。
本文将通过更多细节向您展示这是如何工作的。