C++虚函数表

http://blog.csdn.net/haoel/article/details/1948051/

//虚函数表保存了虚函数的地址,虚函数表相当于一个指针数组

class Base 
{
private://非公有虚函数同样会存在子类的虚函数表中
    int num;
    void real() {cout<<"Base::real"<<endl;}
    virtual void f() { cout << "Base::f" << endl; }
    virtual void g() { cout << "Base::g" << endl; }
    virtual void h() { cout << "Base::h" << endl; }
};

typedef void(*PFun)(void);

main

Base b;
    PFun pFun = NULL;
    cout << "虚函数表地址:" << &b<< endl;
    cout << "虚函数表地址:" << (int*)(&b)<< endl;//同上

    //虚函数表保存了虚函数的地址,所以以(int*)(&b)为地址的值即为虚函数地址
    //虚函数表保存在类对象内存空间的第一个位置
    //继承子类的实例中,同名虚函数会覆盖父类的虚函数在虚表中的位置,没有被覆盖的函数依旧,这样就实现了多态

    cout << "以虚函数表地址为地址的值:" << *((int*)(&b))<< endl;//以(int*)(&b)为地址的值
    cout << "---" << (int*)*(int*)(&b) << endl;//把值强转为int型地址
    cout << "---" << (int*)*(int*)(&b)+1 << endl;//加4个字节
    cout << "---" << (int*)*(int*)(&b)+2 << endl;//指针占4个字节
    cout << "---" << (int*&)b<< endl;//同上

    pFun = (PFun)*((int*)*(int*)(&b));//转化成指向函数的指针
    pFun();//Base::f
    pFun = (PFun)*((int*)*(int*)(&b)+1);
    pFun();//Base::g
    pFun = (PFun)*((int*)*(int*)(&b)+2);
    pFun();//Base::h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值