继承C ++(钻石恐惧)

时间:2013-05-21 10:54:55

标签: c++ inheritance

我有继承的以下问题(我很乐意谷歌,但不知道它看起来是否正确的关键字。)

我有一个Module类,它使用函数IModule实现A()接口。我还有ClientModule类继承Module类并实现IClientModule接口,函数B()继承IModule接口。这是我开始模糊和双继承问题的地方。

这是应该告诉我们更多问题的类图:

enter image description here

我需要使用Module接口对IModule类进行单独访问,并使用ClientModule接口提供对IClientModule接口的访问权限。{ / p>

2 个答案:

答案 0 :(得分:3)

您正在遇到“钻石继承”问题。钻石遗传已经在这个地方和其他地方多次讨论过。从class Module虚拟继承class IClientModuleclass IModule。这不是一个完美的解决方案;有时神奇的作品,有时它不会。如果它不起作用,通常是对继承要求过高的情况。

答案 1 :(得分: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;
};

然而,最好避免将这些混合在一起并使用我原来的解决方案。