对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。
class Base {
public:
virtual void f() { cout << "Base::A" << endl; }
virtual void g() { cout << "Base::B" << endl; }
virtual void h() { cout << "Base::C" << endl; }
};
typedef void(*Fun)(void);
Base D;
cout << "虚函数表地址:" << (int*)(&D) << endl;
cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&D) << endl;
(Fun)*((int*)*(int*)(&D)+0); // Base::A()
(Fun)*((int*)*(int*)(&D)+1); // Base::B()
(Fun)*((int*)*(int*)(&D)+2); // Base::C()
值得注意的是当中的int和整形并没有任何的关系,int只是它正好也是4个字节这样可以对虚表的地址进行操作,从而读出虚表的内容
时间: 2024-10-05 18:39:45