继承了另一个接口的接口的实现
Implementation of Interface inherited of another Interfaces
我有一个抽象接口IA,它继承自具有不同行为的接口IB和IC。此外,我还有来自 IB 的接口 B 和来自 IC 的 C 的实现。如果我需要 A 类实现 IA,但它在 B 和 C 中有部分实现怎么办。如何提供这个。
编辑:最小、完整的示例:
#include <iostream>
class IB
{
public:
virtual void function_B() = 0;
};
class IC
{
public:
virtual void function_C() = 0;
};
class IA : public IB, public IC
{
};
class B : public IB
{
public:
virtual void function_B()
{
std::cout << "Bn";
}
};
class C : public IC
{
public:
virtual void function_C()
{
std::cout << "Cn";
}
};
// then I want IA implementation, but also to use
// ready implementation B and C
// this way doesn't work, the class A stays abstract
class A: public IA, public B, public C
{
};
int main()
{
IA *a = new A;
a->function_B();
a->function_C();
}
你的问题是A
从IB
继承了两次,一次是通过IA
,一次是通过B
。IC
也是如此。
要解决这个 diamon 问题,您必须在类直接从IC
或IB
继承的地方使用虚拟继承:
class IA : public virtual IB, public virtual IC
{
};
class B : public virtual IB
{
public:
virtual void function_B()
{
std::cout << "Bn";
}
};
class C : public virtual IC
{
public:
virtual void function_C()
{
std::cout << "Cn";
}
};
您需要
在A
中重新实现IA
的每个功能。但这些可以是简单的转发器。
如果可能的话,我还建议聚合而不是继承,即不从B
和C
继承,而是使它们成为成员:
class A : public IA {
B b_;
C c_;
public:
void function_B() override { b_.b(); }
void function_C() override { c_.c(); }
};
<</div>
div class="answers"> 在你的代码中,class A
继承自class IA
、class B
和class C
,class IA
是一个抽象类,所以你不能实例化它。
由于Class IA
是抽象的,所以你class A
也变得抽象。所以你需要覆盖class IA
的虚函数(class IB
和class IC
的i-e函数)class A
。
所以你需要在class A
中重新实现上述功能
class A : public IA,public B,public C {
public:
void function_B() override { std::cout << "Bn";}
void function_C() override { std::cout << "Cn";}
};
相关文章:
- 如何从实现接口的模板化类实例访问结构
- 传递实现特定接口的类
- 如何在C++中实现接口
- C++ 使用接口和默认实现继承
- unique_ptr实现接口时对已删除函数的引用
- C++接口实现和子类化对象识别
- 接口实现和私有继承之间的交互
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- 定义大量的接口实现
- cpp文件中的纯虚拟接口实现
- 如何使用接口实现回调
- 继承接口实现
- 如何在C++中编写类java参数级接口实现
- 具有其他默认参数的接口实现
- Mixin和接口实现
- 如何在许多类中重用接口实现
- Emscripten Javascript接口实现
- 获取Firefox内置组件的接口实现
- c++中的头文件和Java中的抽象类/接口实现是相同的想法,这是正确的吗?
- C++中的接口+实现:代码不执行