【发布时间】:2022-01-10 07:10:02
【问题描述】:
我最近在 Don box 的 Essential com 书中引用了一句话
interface ICatDog : ICat, IDog { // 非法,多碱基
COM 出于多种原因禁止多接口继承。一 原因是生成的 C++ 抽象基的二进制表示 类不会是编译器不变的
我想知道是否有人知道为什么多基对 com 不利并且会破坏编译器的不变性。
谢谢
【问题讨论】:
-
请注意,它只是一个COM接口,不能从多个COM接口继承,换句话说,这很好:
class CatDog : ICat, IDog。至于原因,这只是意味着 C++ 标准(当时,今天不确定)没有确保在二进制级别与使用两种不同编译器(例如 MSVC 与 GCC)编译的两个对象的适当兼容性 -
所陈述的原因是相当荒谬的,任何用 C++ 编写的实用 COM 服务器实际上都依赖 MI 来实现它们的接口。他们只是想出了一个更好的方法来做到这一点,不需要广泛的规范来规定确切的 v-table 布局,给实现者很大的灵活性,一种解决歧义的方法和一个后门,如果他们的 C++ 编译器是异常。 IUnknown::QueryInterface() 是一个非常好的主意。
标签: inheritance com compiler-construction