虚拟继承下的Vptr指针?

zxy_zs 2002-12-25 02:12:50
有一个派生情况是这样的:
point

point3d vertex

vertex3d

pvertex


(由于关系线画不出来,只能这样)
point是个虚拟基类。被ponit3d和vertex虚拟继承,vertex3d又多重继承了ponit3d和vertex,pvertex再单一继承vertex3d
按照我的看法是:
如果生成一个pvertex对象,那这个对象的布局应该是这样的:

point3d_subobject
point3d_vptr
vertex_subobject
vertex_3d_datamember
pvertex_subobject
pvertex_subobject
point_subobject
point_vptr


我自己感觉的对象布局应该是这样吧。point3d和vertex各自维护自己的一个vptr指针。虚拟基类自己维护一个vptr指针。因为pvertex是单一继承vertex3d,所以没有再增加一个vptr指针。如果我的理解正确的话。
那在《深度探索C++对象模型》里的P217页“vptr初始化语意学",pvertex的constructor扩充了一个对pvertex的VPTR指针的初始化"this->_vptr_pvertex=_vtbl_PVertex;"那这么说在pvertex的subobject里还有一个vptr指针了??
有哪位对此熟悉的请指教。谢谢!!
...全文
120 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxy_zs 2002-12-26
  • 打赏
  • 举报
回复
zergkkk2002(zergkkk2002) :
谢谢!明白了,
zergkkk2002 2002-12-26
  • 打赏
  • 举报
回复
point

point3d vertex

vertex3d

pvertex

如果使用vc:
point3d类及vertex类都维护有一个虚基类表(不是vbtl),其实例对象中均分配有一个指针(不是vptr)指向该表.而vertex3d类及pvrtex类的实例对象则不含有该指针. point类中若含有虚函数,则该继承体系中的每一个类都维护有自己的一个vbtl,其实例对象中都含有唯一的一个vptr,指向该vbtl.
如:vertex3d* pPoint=new pvertex;
pPoint的静态类型是vertex3d,而动态类型是pvertex;简单的说(实际上要复杂的多)就是可以看作:创建一个pPoint类型的对象,但其中的vptr被替换为pvertex中的vptr.

我的理解:)
zxy_zs 2002-12-26
  • 打赏
  • 举报
回复
luoqy(QYcsdn) :
虚拟继承正是为了避免二义性!
luoqy 2002-12-26
  • 打赏
  • 举报
回复
你如此的写法好像是二义性(即:重定义)写法有错误;定义多态性时,要考虑是否会‘重定义’
vptr虚函数表是在你定义有虚函数时系统调用构造函数时生成的;
this->vptr->地址->函数
earthharp 2002-12-25
  • 打赏
  • 举报
回复
COM技术内幕里的话:
虚基类就好象是一个表格,留给派生类来填表。
想想吧
zxy_zs 2002-12-25
  • 打赏
  • 举报
回复
help!!!!!!!
zxy_zs 2002-12-25
  • 打赏
  • 举报
回复
P123页里有写到,有画出一个虚拟继承的对象布局!
neubird 2002-12-25
  • 打赏
  • 举报
回复
那我就不知道了,对了,深度这本书中哪个地方写到了?我想看一下!
neubird 2002-12-25
  • 打赏
  • 举报
回复
唉,那我也不知道了,对了深度这本书的哪个地方写到vertex有vptr了,我想看一下!
zxy_zs 2002-12-25
  • 打赏
  • 举报
回复
我查过资料,vertex是有vptr的。(深度这本书里就有写到。)
neubird 2002-12-25
  • 打赏
  • 举报
回复
我觉得这个地方vertex没有自己的vptr,如果它没有在虚继承后对其基类的虚函数override或添加自己的虚函数的话。
(自己的理解,仅供参考)
zxy_zs 2002-12-25
  • 打赏
  • 举报
回复
那如果说是名字不同,那应该要维护point3d和vertex两个subobject的vptr,为何只有一个?
我想书上应该是对的。可这个要如何理解?似乎没有其它人对此提出疑问?
zxy_zs 2002-12-25
  • 打赏
  • 举报
回复
是的。单一继续和多重继续中,子类都不会增加VPTR。
vertex3d到pvertex是单一继承,那也不应该在pvertex中有vptr呀?
应该只有从point3d和vertex继承下来的vptr,还有point自己的vptr
是否如此?
neubird 2002-12-25
  • 打赏
  • 举报
回复
我觉得这个地方书上是正确的,_vptr_PVertex与point3d_vptr是等价的,名字不一样而已,并没有增加新的vptr,你的理解也是正确的。
我是这么理解的,不知道你同意否?
neubird 2002-12-25
  • 打赏
  • 举报
回复
这本书我还没学到217页,不过我觉得这个问题可以简单一点理解,如果基类已经有虚表,如果不是虚拟继承那子类就不必增加vptr;如果基类没有虚表,那么则要增加。不知道你这个地方是什么情况,看看先!
JoshuaLi 2002-12-25
  • 打赏
  • 举报
回复
1. c++用虚函数实现晚绑定来达到多态.
2. (一般)编译器根据对象类型确定实际的vptr(及vtbl),并在vtbl中找到目标
虚函数.
3. 一个类因为MI可能有多个vtbl,类对象则会有多个vptr.

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧