带有外部 SDK 的 C++ Diamond of Doom

标签 c++ sdk com multiple-inheritance diamond-problem

我有一个烦人的多重继承厄运钻石,带有复杂的扭曲(我们正在谈论 MS COM 对象,稍后将详细介绍)-

  • 假设有一个抽象类(接口(interface))A,它有一些纯虚方法。
  • 另一个抽象类(另一个接口(interface))B派生自A,并用更多的纯虚方法扩展了它。
  • C 类派生自 A 类并实现了它的所有抽象方法。
  • D 类目前派生自 B 类,实现了 A 和 B 的所有抽象方法。

现在我有两个类 C、D,其中包含大量复制粘贴的代码(因为大部分所需的接口(interface)都位于类 A 中)。我想通过让 D 继承自 C 来避免这种情况,但是 D 也继承自 B,这造成了经典的厄运菱形继承(钻石问题)。

我知道这可以通过虚拟继承来解决,但情节的转折点是:A 类和 B 类是 COM 接口(interface),在我无法修改的 SDK 中定义(即“A.h”和“B.h”是只读的) .从 A 到 B 的继承不是虚拟的,不能修改。我可以修改类 C 和 D,但它们必须完全遵守定义的接口(interface)。

如果有任何关于如何克服这个问题的创意,我将不胜感激。

最佳答案

我从问题的细节假设,你的问题是函数而不是 A 的一些成员变量(这似乎只是一个接口(interface))。

在这种情况下,我会想到两个选项。

1) 让 D 拥有一个 C 而不是继承它。

class D : public B
{
    public:
    virtual int FA()
    {
        return m_c.FA();
    }
    private: C m_c;
};

或者从C私有(private)继承

class D : public B, private C
{
   public:
   virtual int FA()
   {
      return C::FA();
   } 
};

其中 FA() 是 A 中的一些纯虚函数

这两种情况都涉及在D中定义一个函数来实现FA,但实际的实现细节并不重复。

关于带有外部 SDK 的 C++ Diamond of Doom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38457228/

相关文章:

c++ - 重载一元运算符 &

c++ - 条件中的迭代器赋值 - vector 迭代器不兼容

android - 当 Studio 找不到时,如何在 Mac 上找到 Android SDK?

python - 如何从 Python 3.x 调用 CAPL 通用函数?

com - 如何在 WinDbg 中查看 VB6 控件级变量?

c++ - 为什么标准容器使用函数模板而不是非模板 Koenig 运算符

c++ - 用 boost spirit 解析一对整数

android - 在 ARM 上网本 (Ubuntu) 上运行 Android SDK

javascript - 使用 JavaScript SDK/Graph API 从 iframe 应用程序中删除权限?

c# - 互操作后 Excel 进程保持打开状态;传统方法行不通