C ++如何使用其他接口类型的方法从接口继承?

C++ How to inherit from interface with a method of other interface type?

我有这样的结构:

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

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

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

我的意思是如果我有一个 class A 继承自 IA 那么如何在 class [=16= 中声明 A bar() 方法]哪个继承了IB?或者我应该为这件事做第三个 class?

谢谢!

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

virtual IA& bar() = 0;

也许这会有所帮助?

欢迎来到 Java 和 C++ 之间细微差别的奇妙世界。如果您来自 Java 背景,则类型 IA 的值属于类型 IA 或其任何子类。但在 C++ 中,类型 IA 的值是 IA 的具体实例,仅此而已 。而你的 IA 是抽象的,因此没有具体的实例,所以正如所写的那样,你的 IB::bar 是不可满足的。没有明确定义的函数可以具有该类型。

相反,当您想执行 Java 式的基于继承的多态性时(这通常不是 C++ 中的答案,但我们假设它是目前工作的正确工具),你需要一个间接层。这可以是原始指针 (IA*)、引用 (IA&) 或智能指针 (unique_ptr<IA>)。

按照惯例,如果数据打算由调用者拥有,我们return一个智能指针(即调用者负责在完成后释放它) ,如果它由其他人拥有,则为引用;如果我们希望我们的程序员同事受苦,则为原始指针。我假设您打算让调用者拥有 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>();
  }
};
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;
}