虚函数表

虚函数表

#include <iostream>
#include <string>

using namespace std;

class Base1 {
public:
    virtual void f(){
		cout << "Call Base1::f" << endl;
    }                     
    virtual void g(){     
		cout << "Call Base1::g" << endl;
    }                     
    virtual void h(){     
		cout << "Call Base1::h" << endl;
    }
};

class Base2 {
public:
    virtual void f(){
		cout << "Call Base2::f" << endl;
    }
    virtual void g(){
		cout << "Call Base2::g" << endl;
    }
};

class Test: public Base1, Base2{ };

typedef void (*FUN)();	

int main(void){
    FUN ptr_fun;
    long int *ptr;

    Base1 base;
    long int *ptr_base_vtb = (long int*)&base;
    
    cout << "size of base: " << sizeof(base) << endl;
    cout << "address of base: " << &base << endl;
    cout << "address of vtb: " << ptr_base_vtb << endl; 

    ptr = (long int*)*ptr_base_vtb;

    ptr_fun = (FUN)ptr[0]; ptr_fun();
    ptr_fun = (FUN)ptr[1]; ptr_fun();
    ptr_fun = (FUN)ptr[2]; ptr_fun();

    // ========================================
    
    Test test;
    long int *ptr_test_vtb = (long int*)&test;	// &test has type Test*
    cout << "size of &test: " << sizeof(&test) << endl;	// 8

    ptr_test_vtb++;
    ptr = (long int*)*ptr_test_vtb;

    ptr_fun = (FUN)ptr[0]; ptr_fun();
    ptr_fun = (FUN)ptr[1]; ptr_fun();

    return 0;
}


输出:

size of base: 8
address of base: 0x7ffe69612258
address of vtb: 0x7ffe69612258
Call Base1::f	
Call Base1::g	
Call Base1::h	

size of &test: 8
Call Base2::f	
Call Base2::g	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值