【发布时间】:2010-01-01 23:34:13
【问题描述】:
这是我们理想的继承层次结构:
class Foobar;
class FoobarClient : Foobar;
class FoobarServer : Foobar;
class WindowsFoobar : Foobar;
class UnixFoobar : Foobar;
class WindowsFoobarClient : WindowsFoobar, FoobarClient;
class WindowsFoobarServer : WindowsFoobar, FoobarServer;
class UnixFoobarClient : UnixFoobar, FoobarClient;
class UnixFoobarServer : UnixFoobar, FoobarServer;
这是因为我们的继承层次结构会尝试从Foobar 继承两次,因此编译器会抱怨Foobar 的任何成员的引用不明确。
请允许我解释一下为什么我想要这样一个复杂的模型。这是因为我们希望从WindowsFoobar、UnixFoobar、FoobarClient 和FoobarServer 访问相同的变量。这不是问题,只是我想使用以上任意组合的多重继承,这样我就可以在任何平台上使用服务器/客户端功能,也可以在客户端或服务器上使用平台功能。
我不禁觉得这是多继承的一个常见问题......我是从完全错误的角度解决这个问题吗?
更新 1:
另外,考虑到我们可以使用#ifdef 来解决这个问题,但是,这往往会产生非常丑陋的代码,如下所示:
CFoobar::CFoobar()
#if SYSAPI_WIN32
: m_someData(1234)
#endif
{
}
...糟糕!
更新 2:
对于那些想进一步了解本期背景的人,我真的建议浏览一下适当的mailing list thread。事情开始在第 3 篇文章中变得有趣起来。还有一个related code commit,你可以在这里看到真实的代码。
【问题讨论】:
-
我强烈建议您认真考虑多重继承是否是正确的计划。每次我用过多重继承,我都后悔了。我想说你应该仔细研究组合来解决这个问题,或者看看让“最派生”类成为唯一从 Foobar 继承的类。当您尝试实际调试代码时,您生成的继承树将很难理解并且真的很难遵循操作。
-
这就是我害怕迈克尔的原因,但这是我能想到的唯一解决方案。您(或其他任何人)能否想出一个不那么做作且符合我简单要求的相同目标的模型。我正在尝试创建一个可以最大限度地减少代码重复的模型。