C++虚表

对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。

 

class Base {

     public:

            virtual void A() { cout << "Base::A" << endl; }

            virtual void B() { cout << "Base::B" << endl; }

            virtual void C() { cout << "Base::C" << endl; }

 

};

 typedef void(*Fun)(void);

 

            Base D;

 

            cout << "虚函数表地址:" << (int*)(&D) << endl;

            cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&D) << endl;

     

 

    调用Base::A()Base::B()Base::C()代码如下:

 

       (Fun)*((int*)*(int*)(&D)+0);  // Base::A()

            (Fun)*((int*)*(int*)(&D)+1);  // Base::B()

            (Fun)*((int*)*(int*)(&D)+2);  // Base::C()

值得注意的是当中的int和整形并没有任何的关系,int只是它正好也是4个字节这样可以对虚表的地址进行操作,从而读出虚表的内容

           

posted @ 2014-12-23 17:55  HNU-王田  阅读(146)  评论(0编辑  收藏  举报