【问题标题】:Implementing the same method signature from two 'interfaces'从两个“接口”实现相同的方法签名
【发布时间】:2011-12-13 22:48:14
【问题描述】:

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

IaaaIbbb 没有方法体是否比更经典的菱形继承场景更容易/更好,并让X::setVisible 成为 Iaaa::setVisible 的实现和Ibbb::setVisible?

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

【问题讨论】:

  • 你试过了吗?你看到了什么行为?
  • "Iaaa 和 Ibbb 没有方法体这一事实是否让事情变得更容易/更好" 它从来没有。为什么会这样?

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


【解决方案1】:

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

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 关键字。一个接口定义了一个合约;哪一个, 除非该语言对契约式编程有特殊支持, 在大多数情况下意味着接口中的具体代码,带有虚拟 函数是私有的。)

【讨论】:

  • a)我使用“faux-interface”,因为接口不是 C++ 中的语言结构......并不是暗示它们不是“真正的”接口。技术性/不成熟的问题.... b) 在这种情况下,我希望两者都使用相同的实现。但它值得一提的。
【解决方案2】:

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

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

另外,您的问题还有 2 点

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

【讨论】:

  • “定义明确”是我想要的答案——听起来这里没有问题。
猜你喜欢
  • 2015-03-23
  • 2022-01-22
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2014-05-06
  • 2017-12-19
  • 2015-10-19
  • 2015-03-11
相关资源
最近更新 更多