《深度探索C++对象模型》中文版116页,
“某些编译器设计了一种优化技术,只要第二个(或后继)base class声明了一个virtual function,而第一个base class没有,就把多个base classes的顺序调换。这样可以在derived class object中少产生一个vptr”
vptr是如何减少的,想不明白,跪求解答
这个涉及虚表的实现,当一个类继承多个类的时候,例如
class b
{
int g;
virtual void h();
}
class c
{
int t;
}
class a : public b, public c
{
int i;
virtual void f();
}
那么在a中就有两个段,继承自b类的数据段和继承自c类的数据段,也就意味着a类中有俩个地址段。
编译器是如何实现在a类中数据段c中的t成员的查找呢?首先
a* j = new a;
c* s = j;
int k = s->t;
j变量转换成s变量的时候,其实是发生了地址偏移的,比如变量j起始地址是0x234,那么j中b类数据段的起始地址也就是0x234,但是c类数据段就是
0x234 + sizeof(b);基于这个原因,所以在类a中要用类c的虚函数,就必须先将地址偏移到类c数据段,找到虚表指针,然后调用。
第一个基类和当前类公用一个虚表指针。节省虚表指针有个前提,就是子类必须有虚函数,如果没有不管怎么换顺序,结果是一样的
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。