【问题标题】:C++ How to inherit from interface with a method of other interface type?C ++如何使用其他接口类型的方法从接口继承?
【发布时间】:2021-06-23 16:48:45
【问题描述】:

我有这个结构:

class IA
{
    virtual void foo() = 0;
};

class IB
{
    virtual IA bar() = 0;
};

到目前为止,我制作了这两个接口的继承版本,但我在如何具体覆盖 IA IB::bar() 方法时遇到困难?

我的意思是如果我有一个类A 继承自IA 那么如何在继承IB 的类B 中声明A bar() 方法?或者我应该为这件事上三等功?

谢谢! ????

编辑:现在我注意到IB 中的bar() 定义如下:

virtual IA& bar() = 0;

也许这会有所帮助?

【问题讨论】:

  • virtual IA bar() 无法实现,因为您无法创建IA 的实例。您是否打算让它返回一个指向 IA 的指针或引用,该指针或引用指向从 IA 派生的类的对象?
  • @MilesBudnek 不幸的是我无法触及这个结构。我只需要继承它。
  • @winsett 正如 Miles 所说,IA IB::bar() 无法实现。 IB::bar() 必须返回 IA* 指针或 IA& 引用。即使IA 不是抽象的,在没有指针/引用的情况下按值返回IA 仍然不起作用,因为bar() 将slice 它试图返回的任何派生对象。
  • @RemyLebeau 是的,你是对的 - 我再次查看它,它的返回类型是 IA&。乍一看,我错过了这一点,这让我感到困惑。

标签: c++ inheritance multiple-inheritance


【解决方案1】:

欢迎来到 Java 和 C++ 之间细微差别的奇妙世界。如果您来自 Java 背景,则 IA 类型的值是 IA 类型或其任何子类。但在 C++ 中,IA 类型的值是IA 的具体实例,不多也不少。而且您的IA 是抽象的,因此没有具体的实例,因此,您的IB::bar 无法满足。没有定义明确的函数可以拥有这种类型。

相反,当您想要进行 Java 风格的基于继承的多态性(这在 C++ 中通常不是解决方案,但我们假设它是目前适合该工作的工具)时,您需要一个间接层.这可以是原始指针 (IA*)、引用 (IA&) 或智能指针 (unique_ptr<IA>)。

按照惯例,如果数据打算由调用者拥有(即调用者负责在完成后释放它),我们返回一个智能指针,如果它由其他人拥有,则返回一个引用,如果我们想让我们的程序员同事受苦,还有一个原始指针。我假设您打算让调用者拥有 IA 值,因此我们将使用智能指针。

你的接口可以写

#include <memory>

class IA {
  virtual void foo() = 0;
};

class IB {
    virtual std::unique_ptr<IA> bar() = 0;
};

我们可以如下具体实现它们

class A : public IA {
  virtual void foo() {}
};

class B : public IB {
  virtual std::unique_ptr<IA> bar() {
    return std::make_unique<A>();
  }
};

【讨论】:

  • Java 中的对象是通过指针而不是值来传递的。即使 Java 语法不建议使用指针,它们也是。
  • @SilvioMayolo 我注意到我错过了boo() 的返回类型是IA 的引用。您的回答迫使我重新审视,因为乍一看我错过了这个细节。再次感谢!
【解决方案2】:
class IA
{
public:
    virtual void foo() = 0;
};

class IB
{
public:
    virtual IA& bar() = 0;
};
class A : public IA
{
public:
    void foo() override;
};

class B : public IB
{
private:
    A m_a;
public:
    IA& bar() override;
};
void A::foo() {
    ...
}

IA& B::bar() {
    return m_a;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2020-09-07
    • 2018-05-26
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多