从两个“接口”实现相同的方法签名

时间:2011-10-24 08:27:35

标签: c++ multiple-inheritance virtual-functions method-overriding

在C ++中对虚拟接口使用纯虚方法时,当具体类派生自两个具有相同方法声明的“接口”时会发生什么?例如X子类IaaaIbbb并实现方法virtual void setVisible(bool);

事实IaaaIbbb是否没有方法体使事情比更经典的钻石继承场景更容易/更好,并让X::setVisible Iaaa::setVisibleIbbb::setVisible的实施?

我想更多C ++方式来表达问题是“当一个类使用MI从两个具有相同签名的纯虚拟方法的类派生时会发生什么”。

2 个答案:

答案 0 :(得分:12)

  

当一个类使用MI从2个类派生时会发生什么   具有相同的纯虚方法签名

行为定义明确。派生类重写方法将构成接口(即带有所有纯class函数的抽象virtual es)方法的实现。

此外,您问题中的其他两点

  1. 钻石继承尚未发生,因为你还没有 提到了IaaaIbbb
  2. 的任何共同基础
  3. 您无法实施,2 X::setVisible(bool)具有相同的签名

答案 1 :(得分:6)

这取决于。如果两个函数具有相同的签名,并且您希望如此 用相同的功能替换它们,然后就这样做;有 没问题,你的功能将实现它们。如果他们有 不同的签名,那么你需要两个不同的功能 实施它们。如果你想要不同的实现(可能是 如果接口不相关的情况,但它们具有相同的签名, 那么你需要引入中间类来“重命名”它们, e.g:

class MaskSetVisibleInAaa : public Aaa
{
    virtual void setVisibleInAaa( bool ) = 0;
    virtual void setVisible( bool newStatus )
    {
        setVisibleInAaa( newStatus );
    }
};

class MaskSetVisibleInBbb : public Bbb
{
    virtual void setVisibleInBbb( bool ) = 0;
    virtual void setVisible( bool newStatus )
    {
        setVisibleInBbb( newStatus );
    }
};

class ConcreteImplementation
    : public MaskSetVisibleInAaa
    , public MaskSetVisibleInBbb
{
    virtual void setVisibleInAaa( bool );
    virtual void setVisibleInBbb( bool );
};

(我也会质疑你对“faux-interface”的使用.C ++完全支持 真正的接口 - 事实上,比其他一些语言更多 有interface个关键字。接口定义合同;哪一个, 除非该语言对合同编程有特殊支持, 在大多数情况下,暗示接口中的具体代码,具有虚拟 功能是私人的。)