成员函数指针与虚函数调用的底层机制
深入探索 C++ 成员函数指针的内部表示,尤其是针对虚函数时多态调用的解析过程。通过手动模拟虚表索引,理解 `this` 指针调整与偏移计算。 · 难度:入门 · +10XP
成员函数指针与虚函数调用的底层机制
成员函数指针并非简单地址,对于非虚函数它存储的是函数地址,但对于虚函数则存储 vtable 索引。当调用虚成员函数指针时,编译器会通过对象 vptr 找到 vtable,再根据索引间接调用。本教程将演示如何通过模拟虚表结构手工解析指向虚函数的成员指针,揭示 this 指针偏移调整的必要性。
#include <iostream>
struct Base {
virtual void f() { std::cout << "Base::f
"; }
virtual void g() { std::cout << "Base::g
"; }
};
struct Derived : Base {
void f() override { std::cout << "Derived::f
"; }
};
int main() {
void (Base::*pmf)() = &Base::f;
Derived d;
(d.*pmf)(); // 调用 Derived::f
// 查看 pmf 内部表示(依赖于实现)
auto raw = reinterpret_cast<uintptr_t&>(pmf);
std::cout << "内部编码: " << raw << std::endl;
}