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;
}
我有这样的结构:
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;
}