c++ - 使用接口添加功能的 C++ 类层次结构
问题描述
C++。想象一下下面的情况。
有一个从某个基类 A 派生的类的类层次结构。我们不能修改 A,因为它超出了我们的范围。(由一个库提供,它是一个 MFC CView 类,但在这里应该没关系)
所以有 A1、A2 等,它们是以某种方式从 A 派生并提供特定功能的不同类。
现在想象我们定义了一些新的接口 I 来提供一些新的功能。
应用程序的具体对象的类将从 As 和 I 之一继承。我们称它们为 B。(还有几个,比如从 A1 和 I 派生的 B1,从 A2 和 I 派生的 B2 等。)
现在碰巧要实现I的接口,有很多通用代码需要A的功能。我们如何组织类层次结构而不重复太多。
例如,如果有一个函数 I::f 需要为所有派生类 Bn 调用 A::f。为每个 Bn 重新实现 I::f 似乎是浪费。但显然,我们不能直接从 I::f 调用 A::f,因为它们不相关。
我希望你明白这一点。
在这里可以帮助我们的模式是什么?
解决方案
A::f
“在I::f
不彻底检查一切的情况下打电话”的直接解决方案是dynamic_cast
:
struct I {
void f() {
dynamic_cast<A *>(this)->f();
}
};
请注意,这会执行完整的 RTTI 图遍历,以通过Ax
对象的未知动态类型执行交叉转换,因此它可能会比较慢。
推荐阅读
- r - 替换数据帧的非零值
- javascript - 如何在反应中设置子组件的状态?
- html - Angular,无法访问自定义管道中数组中的对象成员
- parallel-processing - # bytes > 128: IMB-EXT 时英特尔 MPI 基准测试失败
- .net - docs.microsoft.com 上的 .NET 平台扩展是什么?
- excel - Excel 2010 - 如何从 2 个列表创建验证列表并给它们倾斜
- android-studio - 将 ca 和 crt 文件导入到 android studio
- r - 在 R 中处理超过一天的时间数据
- javascript - 为什么我得到一个返回字符串的 TypeError
- c++ - 如何监控 QThread