首页 > 解决方案 > 使用接口添加功能的 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,因为它们不相关。

我希望你明白这一点。

在这里可以帮助我们的模式是什么?

标签: c++design-patterns

解决方案


A::f“在I::f不彻底检查一切的情况下打电话”的直接解决方案是dynamic_cast

struct I {
    void f() {
        dynamic_cast<A *>(this)->f();
    }
};

请注意,这会执行完整的 RTTI 图遍历,以通过Ax对象的未知动态类型执行交叉转换,因此它可能会比较慢。


推荐阅读