C++ 组合——我必须包装所有这些函数吗?

标签 c++ oop inheritance composition

我有一个 C++ 类,它描述了对象在 3D 空间中的方向 - 位置、旋转、比例等。我还有其他类必须需要类似信息(或其子集)的信息 - 模型、地形、相机等等。现在我可以创建我的方向类的那些子类,但是谷歌告诉我更喜欢组合而不是继承。这在哲学上是有道理的——一个模型不是不是一个方向,它一个(是的,我知道是-一个有-一个东西只是一种启发式)。然而,为所有那些可能的子类重写相同的包装方法似乎是不必要的,几乎滑稽地不优雅,只是去获得那个功能。 model.getOrientation().set_x(1) 之类的东西看起来也很愚蠢。

我明白为什么这对于小物体来说不会“太糟糕”,但是对于这个例子(以及其他类似的例子),如果你无论如何都必须通过箍来假装你在使用继承?我现在应该使用它吗?我几乎可以肯定我在不恰本地考虑这个问题。

最佳答案

有一种廉价的方法可以避免大部分包装样板文件。

class model : private orientation {
  public:
    using orientation::set_x;
    ... etc ...
};

C++ 中的私有(private)继承并不(必然)意味着"is"。它对局外人来说或多或少是不可见的,有时被描述为“以某种方式实现”的意思。也就是说,您获得了一种有限的组合形式,这有助于让您能够公开组合对象的部分或全部接口(interface)。

关于C++ 组合——我必须包装所有这些函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16991785/

相关文章:

C++ 释放的指针未分配。不免费打电话

php - __get() 和 __set() 是否意味着泄漏封装?

oop - 方法 JavaFx TreeItem getRoot() 不可见。它不是 OOP/MVC 的原因是什么?

c++ - 在C++中增加指针后,为什么打印出一个值而不显示NULL/0?

c++ - 如何在 Observer 中处理具有不同状态值类型的 Observable

Python:从 ttk.Frame 继承时不能使用关键字参数

c# - Microsoft 如何使所有 .NET 类隐式继承自 Object 类?我可以做同样的事情吗?

inheritance - 从没有将类型转换为继承类型的继承结构执行实际对象方法

c++ - 未定义的引用 - CodeBlocks

javascript - 如何在 JavaScript 中找到实例对象的初始创建者?