BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #1630同步于 2008/1/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

Re: 关于c++对象模型中的虚指针

Grape
2008/1/17镜像同步0 回复
贴一个东西(这是网上找的) 关于这部分内容,可以在《深度搜索C++对象模型》里面找到(3.4节)。 vtable的位置的确是编译器有关的:考虑到C语言兼容性以及存取效率和时间的问题。 你可以去书里仔细找。 ------------------------------------------ C++继承分为两种,普通继承和虚拟继承(virtual)。具体的继承又根据父类中的函数是否virtual而不同。 下面就单继承分为几种情况阐述: 1.普通继承+父类无virtual函数 若子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(没有vptr),子类的元素(没有vptr). 若子类有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(没有vptr),子类的元素(包含vptr,指向vtable.) 2. 普通继承+父类有virtual函数 不管子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(包含vptr), 子类的元素. 如果子类有新定义的virtual函数,那么在父类的vptr(也就是第一个vptr)对应的vtable中添加一个函数指针. 3.virtual继承 若子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 子类的元素(有vptr),虚基类的元素.为什么这里会出现vptr,因为虚基类派生出来的类中,虚类的对象不在固定位置(猜测应该是在内存的尾部),需 要一个中介才能访问虚类的对象.所以虽然没有virtual函数,子类也需要有一个vptr,对应的vtable中需要有一项指向 虚基类. 若子类有新定义virtual函数 此时子类的布局是与没有定义新virtual函数内存布局一致.但是在vtable中会多出新增的虚函数的指针. 4.多重继承 此时子类的布局是 : 由低地址->高地址 为父类p1的元素(p1按照实际情况确定元素中是否包含vptr), 父类p2的元素(p2按照实际情况确定元素中是否包含vptr),子类的元素. 如果所有父类都没有vptr,那么如果子类定义了新的virtual function,那么子类的元素中会有vptr,对应的vtable会有相应的函数指针. 如果有的父类存在vptr,我感觉如果子类定义的新的virtual function,会加在第一个有vptr的父类的vtable中.因为子类分配的空间显示并没有新增加一个4字节的指针空间.
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。