虚函数的实现机制

在构造函数初始化时,会初始化一张虚表(所以构造函数不能为虚函数),这张表存放了虚函数的入口地址。如果派生类未实现基类的虚函数fun,则虚表中将存放基类中fun的入口地址,反之则存放派生类中的fun的入口地址。而析构函数一般推荐为虚函数,原因是当B派生自A类时,A* a = new B时,delete a;应该要执行A,B的析构

这个虚指针一般放在类对象的尾端,这样可以保留基类C结构体的对象布局,也就是兼容C,但据说VC++编译器则放在前端,并且它使用虚函数表,如果一个类有一个或多个虚基类,就会由编译器安插一个指针,指向虚函数表,至于真正的虚基类指针当然也是在表格中的.

其它编译器有的在虚函数表中放置虚函数的offset,将虚基类offset和虚函数实体混在一起,有些编译器(sun)虚函数表可以由正负值来索引,正值索引到虚函数,负值索引到虚函数offset

1.每一个类产生出一堆指向虚函数的指针,放在虚函数表中
2.每一个类对象被安插一个虚指针,指向相关的虚函数表.虚指针的设定和重置都由每一个类的构造函数,析构函数和拷贝构造函数自动完成.每一个类所关联的type_info object也经由虚函数表被指出来,通常放在虚函数表的第一个slot
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值