从两个'interfaces'实现相同的方法签名

Implementing the same method signature from two 'interfaces'

本文关键字:方法 实现 interfaces 两个      更新时间:2023-10-16

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

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

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

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

行为定义良好。派生类重写方法将构成两个接口(即抽象class和所有纯virtual函数)方法的实现。

还有,你的问题中的另外两点

  1. 钻石继承还没有发生,因为你还没有提到IaaaIbbb的通用碱基
  2. 你不能实现,2 X::setVisible(bool)与相同的签名

看情况。如果两个函数有相同的签名,你想用相同的函数替换它们,然后这样做;有没问题,您的函数将实现这两种方法。如果他们有不同的签名,那么就需要两个不同的函数来实现它们。如果你想要不同的实现(可能是如果接口不相关),但它们具有相同的签名,然后你需要引入中间类来"重命名"它们,例如:

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 );
};

(我也会质疑你对"人造界面"的使用。c++完全支持实际上,真正的接口比其他语言更重要有一个interface关键字。接口定义了一个契约;哪一个除非该语言对契约式编程有特殊支持,在大多数情况下,在接口中暗含具体代码,带有虚代码函数是私有的