C++单继承虚函数表探索
在vs2022中,虚函数表在监视窗口和内存里显示不全,可以采用以下方法来查看所有虚函数地址:
定义函数指针,因为虚函数表本质上是一个函数指针数组,其中每个指针都指向一个虚函数,因此我们只需要取到这个虚函数表就可以查看每个虚函数的地址
//单继承虚函数表探索
class Base
{
public:virtual void func1() { cout << "Base::func1()" << endl; }virtual void func2() { cout << "Base::func2()" << endl; }
private:int a;
};class Derive :public Base
{
public:virtual void func1() { cout << "Derive::func1()" << endl; }virtual void func3() { cout << "Derive::func2()" << endl; }virtual void func4() { cout << "Derive::func4()" << endl; }void func5() { cout << "Derive::func5()" << endl; }
private:int b;
};typedef void(*VFPTR)();
void PrintVTable(VFPTR* vtable)
{cout << "虚函数表地址是:" << vtable << endl;for (int i = 0; vtable[i] != nullptr; i++){printf("第%d个虚函数地址是: ", i);printf("0x%p", vtable[i]);VFPTR f = vtable[i];f();}cout << endl;
}int main()
{Base b;Derive d;VFPTR* vtable1 = (VFPTR*)(*(int*)&b);VFPTR* vtable2 = (VFPTR*)(*(int*)&d);PrintVTable(vtable1);PrintVTable(vtable2);return 0;
}