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

时间:2015-08-23 20:17:35

标签: c++ polymorphism

下面的代码可行,但我不太清楚我理解为什么成员函数指针memfunc_ptr最终指向正确的函数Derived::member_func()(参见示例here)。我知道成员函数指针将偏移定义到对象的类中,为此定义了它,在本例中为类Base。因此,为了证明代码获得的结果,即调用成员函数Derived::member_func,而不是Base::member_func,我必须得出结论,偏移应用于类Derived的vtable,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)(); 
}

1 个答案:

答案 0 :(得分:3)

[{ "ref_id": 1, "codes": [ 46, 742, 89, 374, 893, 27, 4, 68 ] }, { "ref_id": 2, "codes": [ 766, 9, 84, 8, 4576, 49, 76, 4 ] }]是一个虚函数。因此,编译器将始终为所指向的对象的实际类型调用最合适的函数。确保这一点的方式是特定于实现

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

article将向您展示如何使用更多详细信息。