gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:35:17 27 4
gpt4 key购买 nike

我有一个烦人的多重继承厄运钻石,带有复杂的扭曲(我们正在谈论 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com