我正在努力更好地理解vTables和vPointers为我们提供的解析内存布局。我完全理解多态性及其工作原理,并且确实没有问题,但是有一些小问题我似乎正在趁着内存布局并理解虚拟基本偏移。我知道这些东西在每天的C ++代码中并不是完全必要的,但是为了得到正在发生的事情,这是我的兴趣。
我一直在引用this网站,以帮助理解因使用虚拟继承而导致的内存布局。
在页面的虚拟继承部分中,大约有一半的时间它为所生成的vTable提供了视觉效果,但是我想澄清一下我认为发生了几个事件的顺序:
http://www.phpcompiler.org/articles/virtualinheritance/vtable2.png
在上图中,我觉得:
Left
vTable Left
类的唯一值(Left::b
)int Left::b
= 8,因此我们将Top::a
偏移8,并将其添加到布局的底部。http://www.phpcompiler.org/articles/virtualinheritance/vtable3.png
在上面的这张图片中,我觉得:
Left::b
)Right::c
)Bottom
班级Bottom::d
Bottom
类对我而言,我认为在许多情况下确定内存布局时上述过程是有意义的,但是我想知道如果我改变一些事情会发生什么。
Bottom
几乎从Left
和Right
Left
和Right
,但说Right
定义了自己的int a
,显然这会使bottom.a
等于bottom.Right::a
1}}因为它是最近被覆盖的,但是它会放在内存布局中吗?我的每个问题都有一个提案布局(2),并想知道我背后的想法是否正确,如果没有,为什么......谢谢!
1)
+--Bottom---+
| vPtrLeft |
| vPtrRight |
| Bottom::d |
| Left::b--+---From offset calculated by vPtr.Left in Bottom vTable
| Right::b-+---From offset calculated by vPtr.Right in Bottom vTable
| Top::a --+---From offsets calculated from vPtr.Left and vPtr.Right
+-----------+
None
)(即不要求偏移)None
)(即不需要抵消)Bottom::d
)Left
的所有虚拟数据,然后Right
爬上继承链,直到我们完成Left
和Right
的虚拟继承{{1}属性2)。
Top::a
寻找我对这些布局背后逻辑的反馈,谢谢。
我知道这被标记为重复,但我相信这个问题涉及的内容比其他问题更多,我正在寻找一些常规多虚拟继承变体的答案,以了解具有虚拟继承的对象内存布局< / p>