下面的代码可行,但我不太清楚我理解为什么成员函数指针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)();
}
答案 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将向您展示如何使用更多详细信息。