这是我们理想的继承层次结构:
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
类的两个拷贝。要获得单个拷贝,您需要使用虚拟继承。阅读多重继承 here .
class Foobar;
class FoobarClient : virtual public Foobar;
class FoobarServer : virtual public Foobar;
class WindowsFoobar : virtual public Foobar;
class UnixFoobar : virtual public Foobar;
但是,与多重继承相关的问题很多。如果你真的想展示模型,为什么不让 FoobarClient
和 FoobarServer
在构造时引用 Foobar
,然后有 Foobar& FoobarClient/Server::getFoobar
?
组合通常是摆脱多重继承的一种方式。现在举个例子:
class WindowsFoobarClient : public WindowsFoobar
{
FoobarClient client;
public:
WindowsFoobarClient() : client( this ) {}
FoobarClient& getClient() { return client }
}
但是 care must be taken在构造函数中使用 this。
关于c++ - 使用 C++,我如何正确地从同一个基类继承两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1990032/