virtual实现原理


1. 在没有virtual的情况下,以基类指针调用时编译器并不知道比基类更多的东西,通常调用函数的基类版本

2. 当用virtual声明函数时,每当创建一个包含虚函数的类或者从包含虚函数的类派生的类时,编译器就创建一个VTABLE

3. 如果派生类没有对基类的virtual函数进行重新定义,VTABLE中就填充基类的虚函数的地址

4. 编译器会在类中放置一个VPTR,VPTR指向相应的VTABLE,VPTR的初始化在构造函数中完成



1.  VPTR 常常在对象的开头

2. 所有的VTABLE有相同的顺序,不管何种类型的对象play()是第一个,what()是第二个,adjust()是第三个,所以编译器知道adjust在VPTR+2处,而不是以instrument::adjust地址调用这个函数(这是早绑定)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值