继承多个接口怎样防止冲突?

2023-03-01 09:57:48 +08:00
 aqtata

接口声明

class IBase
{
public:
    virtual void show() = 0;
}

class IA : public IBase;
{
public:
    virtual void helloA() = 0;
}

class IB : public IBase;
{
public:
    virtual void helloB() = 0;
}

我设想的实现定义

class BaseImpl : public IBase
...
    
class AImpl : public BaseImpl, public IA
...
    
class BImpl : public BaseImpl, public IB
...

但是编译失败,原因是 AImpl 和 BImpl 继承了多个接口,show 方法存在冲突。应该怎样解决?

2005 次点击
所在节点    C++
6 条回复
liuran
2023-03-01 10:02:43 +08:00
这就是菱形继承啊,要用虚继承啊
jxdqwert131
2023-03-01 11:22:50 +08:00
class IA :virtual public IBase;
vzong
2023-03-01 13:57:43 +08:00
将所有接口中的方法都实现:在实现类中实现所有接口中的方法,这样就可以避免方法冲突。但是这样可能会导致代码重复,并且可能会使实现类变得臃肿。

使用虚拟继承:虚拟继承可以解决多重继承中的冲突问题。虚拟继承是一种特殊的继承方式,可以保证只有一个基类实例。在本例中,将 BaseImpl 类继承 IBase 接口时,使用虚拟继承即可解决接口冲突问题:
class BaseImpl : public virtual IBase
{
public:
virtual void show() { /* 实现 IBase::show() */ }
};

class AImpl : public virtual BaseImpl, public virtual IA
{
public:
virtual void helloA() { /* 实现 IA::helloA() */ }
};

class BImpl : public virtual BaseImpl, public virtual IB
{
public:
virtual void helloB() { /* 实现 IB::helloB() */ }
};
使用虚拟继承后,AImpl 和 BImpl 类继承的 IBase 接口将共享一个实例,从而避免了 show 方法的冲突。
e7
2023-03-01 14:16:32 +08:00
看能不能避免这种◇的接口设计,java 没有多继承不也活得好好的
junmoxiao
2023-03-01 15:49:21 +08:00
接口只弄一层就行了
alqaz
2023-05-02 19:37:55 +08:00
c++经典问题,不过工作中很少遇到这种继承,感觉都快忘记了,另外,组件(实现类)尽量用组合拼接功能,暴露尽量少的接口。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/920056

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX