嵌套类和C++中的多重继承之间的内存布局差异?

kyb*_*lgd 3 c++ com object-layout

我试图了解COM如何指定其对象的布局,以便想要使用COM对象的客户端知道如何做到这一点.

我已经读过实现多个接口的COM对象可以用不同的方式来实现它,包括使用嵌套类或多重继承.

我的理解是两种技术都必须产生相同的内存布局(符合COM规范),以便想要使用COM对象的客户端(例如在C中)知道如何做.

所以我的具体问题是:使用多重继承与嵌套类实现的c ++对象的内存布局是否存在差异.

有人能指出我指定COM对象布局的位置吗?

Han*_*ant 8

COM完全不知道对象的内存布局.它想要和需要的只是一个函数指针表,当它调用时IUnknown::QueryInterface().你如何实现它完全取决于你.MFC使用嵌套类,几乎任何其他东西都利用C++编译器中对多重继承的内置支持.MSVC++编译器实现它的方式与COM所需的完全兼容.这不是偶然的.使用您在书中列出的有关COM的样板代码,该代码显示了如何正确实现IUnknown.


Chr*_*son 5

COM中指定的唯一"布局"是与每个接口关联的vtable(虚函数指针表).每个接口都派生自IUnknown,因此无论客户端具有指针的对象的任何接口,他都可以调用QueryInterface来获取同一对象上的不同接口.

对象没有强制布局.实际上,COM中对象的整体思想与OO语言中的类实例非常不同:了解同一COM对象是否暴露两个接口的唯一方法是在两个接口上调用IUnknown接口的QueryInterface - 当且仅当它们返回相同的接口指针时,它们才是同一对象的接口.

这是一个非常灵活的想法:

  • 例如,可以将COM对象的一部分内部状态加载到内存中:当请求进一步的接口时,其状态的其他部分可能是延迟加载/分配的.
  • COM对象的状态可以分布在几个非连续的内存区域中.