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

Mr.*_*Boy 15 c++ overriding virtual-functions multiple-inheritance

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

难道事实IaaaIbbb没有方法体使事情更容易/比一个更经典的菱形继承的情况下,并让X::setVisible 两者的实施Iaaa::setVisibleIbbb::setVisible

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

iam*_*ind 13

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

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

此外,您的问题还有2点

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


Jam*_*nze 6

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

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 );
};
Run Code Online (Sandbox Code Playgroud)

(我也会质疑你对"faux-interface"的使用.C++完全支持实际接口 - 事实上,比其他一些有interface关键字的语言更具支持性.接口定义了一个契约;除非语言特别支持按合同编程,在大多数情况下暗示接口中的具体代码,虚函数是私有的.)