接口声明
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 方法存在冲突。应该怎样解决?
1
liuran 2023-03-01 10:02:43 +08:00 via Android
这就是菱形继承啊,要用虚继承啊
|
2
jxdqwert131 2023-03-01 11:22:50 +08:00
class IA :virtual public IBase;
|
3
vzong 2023-03-01 13:57:43 +08:00 2
将所有接口中的方法都实现:在实现类中实现所有接口中的方法,这样就可以避免方法冲突。但是这样可能会导致代码重复,并且可能会使实现类变得臃肿。
使用虚拟继承:虚拟继承可以解决多重继承中的冲突问题。虚拟继承是一种特殊的继承方式,可以保证只有一个基类实例。在本例中,将 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 方法的冲突。 |
4
e7 2023-03-01 14:16:32 +08:00
看能不能避免这种◇的接口设计,java 没有多继承不也活得好好的
|
5
junmoxiao 2023-03-01 15:49:21 +08:00
接口只弄一层就行了
|
6
alqaz 2023-05-02 19:37:55 +08:00
c++经典问题,不过工作中很少遇到这种继承,感觉都快忘记了,另外,组件(实现类)尽量用组合拼接功能,暴露尽量少的接口。
|