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

C++ Diamond of Doom with external SDK

我有一个烦人的多重继承厄运钻石,带有复杂的扭曲(我们谈论的是 MS COM 对象,稍后会涉及到的细节)-

现在我有两个 classes C、D,其中有很多复制粘贴的代码(因为大部分所需的接口都位于 class A 中)。我想通过让 D 继承自 C 来避免这种情况,但是 D 也继承自 B,这会造成 classic 钻石厄运问题。

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

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

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

在那种情况下,spring 需要考虑两个选项。

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

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

或从 C

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

其中 FA() 是 A 中的某个纯虚函数

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

The ATL解决这种情况的方法:

template <typename Itf>
class IAImpl : public Itf {
  // Implement IA methods
};

class C : public IAImpl<IA> {};

class D : public IAImpl<IB> {
  // Implement methods of IB that are in addition to IA.
};