0

我有以下继承问题(我很想用谷歌搜索它,但不知道它似乎正确的关键字)。

我有一个用函数Module实现IModule接口的类A()。我也有ClientModule继承Module类并使用继承接口IClientModule的函数实现接口的类。这是我开始遇到歧义和双重继承问题的地方。B()IModule

这是应该更多地说明问题的类图:

在此处输入图像描述

我需要对具有接口的ModuleIModuleClientModule提供对接口的IClientModule访问的IModule接口进行单独的访问。

4

2 回答 2

3

您遇到了“钻石继承”问题。钻石继承已在本网站和其他地方多次讨论。使继承class Moduleclass IClientModuleclass IModule虚拟。这不是一个完美的解决方案;有时魔法有效,有时无效。在它不起作用的地方,通常是对继承要求过高的情况。

于 2013-05-21T11:19:09.293 回答
1

使 IClientModule 不继承 IModule(并可能将其重命名为 IClient)。在ClientModule 中,只需继承Module 并实现IClient。

或者,在阅读您的评论后编写的替代解决方案:

让您的 ClientModule 类从 IClientModule 继承,如您的示例所示。但是,不是从 Module 继承,而是简单地给 ClientModule 一个成员变量,它是一个 Module,并在需要时将调用转发到该成员。像这样的东西:

class IModule { virtual void A() {} };
class Module : public IModule { ... };
class IClientModule : public IModule { virtual void B() {} };

class ClientModule : public IClientModule 
{
    // ...
    virtual void A() { _module.A(); }

private:
    Module _module;
};

但是,最好避免将它们混在一起并使用我原来的解决方案。

于 2013-05-21T11:13:29.887 回答