aqtata
V2EX  ›  C++

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

By aqtata at 2023 年 3 月 1 日 · 3266 次点击

接口声明

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 方法存在冲突。应该怎样解决?

6 条回复  •  2023-05-02 19:37:55 +08:00
liuran
   1
liuran  
   2023 年 3 月 1 日 via Android
这就是菱形继承啊,要用虚继承啊
jxdqwert131
   2
jxdqwert131  
   2023 年 3 月 1 日
class IA :virtual public IBase;
grokop
   3
grokop  
   2023 年 3 月 1 日   ❤️ 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 方法的冲突。
e7
   4
e7  
   2023 年 3 月 1 日
看能不能避免这种◇的接口设计,java 没有多继承不也活得好好的
junmoxiao
   5
junmoxiao  
   2023 年 3 月 1 日
接口只弄一层就行了
alqaz
   6
alqaz  
   2023 年 5 月 2 日
c++经典问题,不过工作中很少遇到这种继承,感觉都快忘记了,另外,组件(实现类)尽量用组合拼接功能,暴露尽量少的接口。
© 2026 V2EX · 50ms · 3.9.8.5