我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
can we create multiple pure virtual interfaces in hierarchy and their implementation without code explosion
在纯虚拟类的实现(下面的B_Impl(中,我们需要定义对应于所有派生的纯虚拟类(A和B(的所有方法,即使我们也是从实现类(A_Impl(派生的。 我有以下纯虚拟类:
class A
{
public:
virtual bool M1() = 0;
virtual ~A() = default;
};
class A_Impl: public virtual A
{
public:
bool M1() override { return true;}
virtual ~A_Impl() = default;
};
class B : public virtual A
{
public:
virtual ~B()=default;
virtual bool M2() = 0;
};
class B_Impl : public B, public A_Impl
{
public:
virtual ~B_Impl() = default;
bool M2() override { return true; }
};
int main()
{
B_Impl bimpl();
return 0;
}
在编译时,我收到以下错误:
1.cpp: 在函数 'int main((' 中: 1.cpp:31:5:错误:无效的抽象返回类型"B_Impl" B_Impl bimpl((; ^~~~~~ 1.cpp:22:7:注意:因为以下虚函数在"B_Impl"中是纯的: B_Impl类:公共B类,公共A_Impl ^~~~~~ 1.cpp:4:14:注意:虚拟布尔值 A::M1(( 虚拟布尔值 M1(( = 0;
当我也从A_Impl 派生时,我也不想在 B_Impl 中定义 A 的所有方法。
您的代码缺少多个问题。
首先A_Impl
不是从A
派生出来的,这意味着它不能覆盖M1
。
我认为你的方法不是很详细,你应该考虑重新思考你的架构。
您的问题是B_Impl
对象有两个A
子对象,其中一个子对象没有覆盖其M1
方法。
B_Impl
对象如下所示:
+-------------------------+
| +---------+ +---------+ |
| | +-----+ | | +-----+ | |
| | | | | | | | | |
| | | A | | | | A | | |
| | | | | | | | | |
| | +-----+ | | +-----+ | |
| | A_Impl | | B | |
| +---------+ +---------+ |
| B_Impl |
+-------------------------+
它有A_Impl
和B
子对象,每个子对象都有自己的A
子对象。
要解决此问题,您需要使用虚拟继承。 如果您声明A_Impl
和B
实际上继承自A
,那么B_Impl
最终将如下所示:
+--------------------------+
| +-----+ +------+ +-----+ |
| | | | | | | |
| | A | |A_Impl| | B | |
| | | | | | | |
| +-----+ +------+ +-----+ |
| B_Impl |
+--------------------------+
它有一个由B
和A_Impl
共享的A
subojbect。
为此,只需添加virtual
关键字:
class A
{
public:
virtual bool M1() = 0;
virtual ~A() = default;
};
class A_Impl : public virtual A
{
public:
bool M1() override { return true;}
virtual ~A_Impl() = default;
};
class B : public virtual A
{
public:
virtual bool M2() = 0;
virtual ~B()=default;
};
class B_Impl : public virtual B, public A_Impl
{
public:
virtual ~B_Impl() = default;
bool M2() override { return true; }
};
请注意,我还声明B_Impl
实际上从B
派生。 通常,最好从接口虚拟继承。 这样,如果您混合使用源自B
的C
接口和源自C
和B_Impl
的C_Impl
,您就不会遇到同样的问题。
请记住,初始化任何虚拟派生的类是派生最多的类,所以如果你要使A
非默认可构造的,那么最终B_Impl
将负责调用A
的构造函数,而不是A_Impl
隐藏该责任。
- gRPC 生成的代码缺少服务实现
- LLVM |如何实现逻辑非操作的 IR 代码生成
- 如何知道用于实现标准代码段的确切数据结构和算法,例如在C++STL中?
- 在实现合并排序代码时无法计算所有反转
- 如何实现此伪代码?
- 使用双LL在C++中实现Stack失败,出现异常"EXC_BAD_ACCESS(代码=2,地址=0x7fff5
- 如何减少大量包装类的实现代码?
- 如何以及在何处使用带QT的Basler Cam实现opencv人脸检测代码
- 实现在多线程代码中安全恢复的断点
- C++实现代码中的字符串不应存在于输出二进制文件中.如何解决
- 实现代码如何仅包含头文件
- 中断迭代器的 ICU 实现代码
- 两个插件链接到具有不同实现(代码)的同名 DLL 或共享库对象 (so)
- C++:模板实现(代码样式)
- 其中是time.h实现代码
- Dijkstra算法实现-代码不能用于较大的输入
- 理解数据结构实现代码
- 如何使用嵌套枚举实现代码重用
- 在这个应用程序中通过JNI实现C++代码值得吗
- C++中的接口+实现:代码不执行