C++ 虚函数表 单继承

        本文研究单继承情况下,c++对象的虚函数表的具体情况。

        假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2。

测试的代码如下:

#include<iostream>
using namespace std;
class  A
{
public:
        virtual void fun1()
        {
                cout<<"A::fun1"<<endl;
        }

};

class B:public A
{
public:
        virtual void  fun2()
        {
                cout<<"B::fun2"<<endl;
        }

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

};

typedef void (*Fun)(void);
int main(int argc, char* argv[])
{
        B   b;

        cout<<"虚函数表指针的地址为:"<<(int *)(&b)<<endl;
        cout<<"虚函数表的地址为:"<<*(int *)(&b)<<endl;
        cout<<"第一个虚函数fun1的地址为:"<<(int *) *(int *)(&b)<<endl;


        Fun  fun1=( Fun) ( *(int *) *(int *)(&b));
        fun1();

        cout<<"第二个虚函数fun2的地址为:"<<  (int *)    ((int *) (*(int *)(&b))+1) << endl;
        Fun fun2=(Fun) (* ((int *) (*(int *)(&b))+1));
        fun2();
        return 0;
}
运行结果:

虚函数表指针的地址为:0xbfa9a77c
虚函数表的地址为:134515592
第一个虚函数fun1的地址为:0x8048b88
B::fun1
第二个虚函数fun2的地址为:0x8048b8c
B::fun2

       测试代码说明:

       虚函数表指针             (int *)(&b)

       虚函数表地址           *(int *)(&b)

       虚函数表的第一个元素,也就是指向fun1的指针  (int * )(*(int *)(&b))

       虚函数表的第二个元素,也就是指向fun2的指针  (int * )(*(int *)(&b)) + 1)


在这种单继承的情况下,如果有虚函数表,那么只有一个虚函数表,并且按照虚函数声明的顺序顺序排列,派生类的虚函数紧接着基类的虚函数排列,B的虚函数表结果如下图所示:

                      


posted on 2014-04-22 23:35  胡永光  阅读(161)  评论(0编辑  收藏  举报

导航