开发者社区> 问答> 正文

深度探索C++对象模型 虚函数表指针问题

《深度探索C++对象模型》中文版116页,
“某些编译器设计了一种优化技术,只要第二个(或后继)base class声明了一个virtual function,而第一个base class没有,就把多个base classes的顺序调换。这样可以在derived class object中少产生一个vptr”
vptr是如何减少的,想不明白,跪求解答

展开
收起
a123456678 2016-03-06 13:51:43 2230 0
1 条回答
写回答
取消 提交回答
  • 这个涉及虚表的实现,当一个类继承多个类的时候,例如
    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数据段,找到虚表指针,然后调用。
    第一个基类和当前类公用一个虚表指针。节省虚表指针有个前提,就是子类必须有虚函数,如果没有不管怎么换顺序,结果是一样的

    2019-07-17 18:54:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载