c++ - 使用 C++,我如何正确地从同一个基类继承两次?

标签 c++ multiple-inheritance

这是我们理想的继承层次结构:

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 的任何成员的引用不明确。

请允许我解释一下为什么我想要这样一个复杂的模型。这是因为我们希望从 WindowsFoobarUnixFoobarFoobarClientFoobarServer 访问相同的变量。这不是问题,只是我想使用以上任意组合的多重继承,这样我就可以在任何平台上使用服务器/客户端功能,也可以在客户端或服务器上使用平台功能。

我不禁觉得这是多继承的一个常见问题......我是从完全错误的角度解决这个问题吗?

更新 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;

但是,与多重继承相关的问题很多。如果你真的想展示模型,为什么不让 FoobarClientFoobarServer 在构造时引用 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/

相关文章:

c++ - 将派生类实例作为 void* 传递给 C++ 中的通用回调

c++ - 为什么我不能使用继承来实现C++中的接口(interface)?

c++ - 重载解析、模板和继承

c++ - Qt list.clear() 会破坏对象的吗?

原始指针和 shared_ptr 之间的 C++ 接口(interface)

java - 创建一个对象以在多个 TestNG 类之间共享数据

c++ - C++跨平台snprintf如何实现?

c++ - 如何防止右值和左值成员函数之间的代码重复?

Java 继承 : multiple extends needed

swagger - OpenAPI/JSON Schema 中的多重继承/组合