我有继承的以下问题(我很乐意谷歌,但不知道它看起来是否正确的关键字。)
我有一个Module
类,它使用函数IModule
实现A()
接口。我还有ClientModule
类继承Module
类并实现IClientModule
接口,函数B()
继承IModule
接口。这是我开始模糊和双继承问题的地方。
这是应该告诉我们更多问题的类图:
我需要使用Module
接口对IModule
类进行单独访问,并使用ClientModule
接口提供对IClientModule
接口的访问权限。{ / p>
答案 0 :(得分:3)
您正在遇到“钻石继承”问题。钻石遗传已经在这个地方和其他地方多次讨论过。从class Module
虚拟继承class IClientModule
和class 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;
};
然而,最好避免将这些混合在一起并使用我原来的解决方案。