gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:34:53 26 4
gpt4 key购买 nike

我是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com