菱形继承问题(钻石问题)(2)

可以这么理解,01116bdc和01116be4之间的差值为8,就是说从B索引A的地址偏移比从C索引A的地址偏移要多上8位(在对象d中来说),从上图这个内存布局来看,对象d中B的位置和C的位置正好相差8个字节,就是说B中的A和C中的A存放的已经是一个地址了,这个地址会索引到真正使用的“A”就是上图中的绿色区域.

然而这并不是直接索引到绿色区域穿的偏移地址,其实一看你就会发现,这个地址过于大了,其实这个地址确实是偏移地址没错,但是指向的并不是直接的A的地址快,而是一个vbptr虚继承表,这个表和虚表可不是一个东西!!!!其中存放的是真正的偏移量(不是偏移地址了),这个偏移量是指从当前对象的地址开始算,往后偏移的字节数。

菱形继承问题(钻石问题)

vbptr虚基类指针会出现在类的一开始的内存地址(虽然你看到的是从int型开始的),然后这个内存地址加上我刚才所说的存储好的偏移量,就能索引了,而且有了这个表和指针之后,很大程度上减少了内存空间的占用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fb0d7b040bf2dd4e7e0cbf87f5f819b9.html