Essential COM中的BASE_OFFSET宏

ist*_*dy0 5 c++ com macros

我正在阅读Essential COM并在本书的第2章遇到了一个宏'BASE_OFFSET',我并不真正理解它的语法或为什么这样做.

#define BASE_OFFSET(ClassName, BaseName) \
(DWORD_PTR(static_cast<BaseName*>(reinterpret_cast<ClassName*>(0x10000000))) - 0x10000000)
Run Code Online (Sandbox Code Playgroud)

谁能解释这个宏以及我们如何使用它?事实上,这本书使用了这个宏,但由于我不太了解它,我没有看到它的实际用法.非常感谢你提前.

R. *_*des 7

宏构成了一个虚拟的指针ClassNamereinterpret_cast,然后它投影到BaseNamestatic_cast.

在存在多重继承的情况下,基类子对象的地址并不总是与对象的地址相同.从原始虚拟地址中减去该可能不同的地址,以获得BaseName对象中子对象的偏移量ClassName.它类似于offsetof,但对于基类子对象而不是成员.

图显示了一个例子

这只有在你做一些令人讨厌的低级别的东西时才有用.