带有外部 SDK 的 C++ Diamond of Doom
C++ Diamond of Doom with external SDK
我有一个烦人的多重继承厄运钻石,带有复杂的扭曲(我们谈论的是 MS COM 对象,稍后会涉及到的细节)-
- 假设一个抽象 class(接口)A 具有一些纯虚方法。
- 另一个抽象class(另一个接口)B派生自A并用更多的纯虚方法扩展它。
- Class C 派生自 class A 并实现了它的所有抽象方法。
- Class D 当前派生自 class B,实现了 A 和 B 的所有抽象方法。
现在我有两个 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.
};
我有一个烦人的多重继承厄运钻石,带有复杂的扭曲(我们谈论的是 MS COM 对象,稍后会涉及到的细节)-
- 假设一个抽象 class(接口)A 具有一些纯虚方法。
- 另一个抽象class(另一个接口)B派生自A并用更多的纯虚方法扩展它。
- Class C 派生自 class A 并实现了它的所有抽象方法。
- Class D 当前派生自 class B,实现了 A 和 B 的所有抽象方法。
现在我有两个 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.
};