c++ - 避免在继承的树类中向下转型

标签 c++

我是 C++ 的新手,现在在我的设计中我似乎无法避免向下转型。我知道这通常是糟糕设计的标志,所以我想知道执行此操作的更好方法是什么。

我有一个 Frame 类,它表示几何框架树并允许它们之间进行几何变换:

class Frame
{
    private:
      Frame *_parent;
      std::vector<Frame*> _children;

    public:
      Frame* getParent() const;
      std::vector<Frame*> getChildren() const;
      ... (extra methods for geometrical transformations)
}

我现在想创建一个新的 Frame 子类,MechanicalFrame,它添加了一些处理动态属性的功能。

class MechanicalFrame
{
   private:
     double mass;
     ...
   public:
     void compute();
 }

我的问题是,“计算”方法需要实现一些递归逻辑,因此它会包含如下内容:

MechanicalFrame::compute()
{
   for element in getChildren():
     element.compute();
}

但是,由于 getChildren 返回 Frame* 而不是 MechanicalFrame*vector,我需要此时制作一个static_cast。我已经对这个问题进行了很多思考,但我找到的解决方案中没有一个让我完全满意:

解决方案 1) 静态转换:它以某种方式指示糟糕的设计

解决方案 2) 将计算方法添加到具有虚拟实现的基类 (Frame),即抛出异常:强制基于派生的父类实现似乎不自然类。

解决方案 3) 从 Frame 中完全拆分 MechanicalFrame:这意味着要重新实现 Frame 中已有的许多功能。

任何帮助将不胜感激。 非常感谢:)

最佳答案

使用多态行为,使用你的解决方案 2)

您可以遵循以下模式(接口(interface) -> 基类 -> 派生类)

class IFrame
{
public:
    virtual void compute()=0;
}

class Frame:public IFrame
{
public:
    virtual void compute() {/*nothing to do*/}
}

class MechanicalFrame:public Frame
{
public:
    virtual void compute() {/*your implementation with mass*/}
}

关于c++ - 避免在继承的树类中向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41673695/

相关文章:

c++ - 后期绑定(bind)有什么优点?举一个 C++ 函数指针上下文中的例子

c++ - 我可以空基优化可变数据吗?

c++ - 如何在 Windows x64 机器上使用 VS 2010 构建 MySQL 连接器 c++?

c++ - C/C++ : libcurl + extended ASCII chars = bad Google Translation API result

c++ - 如何使用 Bamboo CI 处理 C++ CMake 项目之间的依赖关系?

c++ - 在 bool 中设置额外位使其同时为真和假

c++ - 什么时候在空实例上调用成员函数会导致 C++11 中的未定义行为?

c++ - 如何优化 C++ 类容器的加法运算符?

c++ - 在 Centos 中安装 QT - 安装 OpenBR 时的 CMake 警告

c++ - 访问类成员