当我使用根据基类定义的成员函数指针时,编译器如何调用派生成员函数?



下面的代码可以工作,但是我不太确定我理解为什么成员函数指针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()是虚函数。因此,编译器将始终针对所指向的对象的实际类型调用最合适的函数。确保这一点的方法是特定于实现的

最常用的方法是使用虚函数表,即函数指针表。在构造对象期间初始化指向虚函数表的指针。每次引用这样的虚函数时,编译器都会生成代码来查找虚函数表中的函数指针(使用虚函数表中的偏移量)。当您使用指向虚函数的指针时,编译器将生成代码以在虚函数表中查找正确的指针。

本文将通过更多细节向您展示这是如何工作的。

最新更新