我在Ubuntu 11.10和最新版本的NetBeans下使用C ++。让我们说我有 以下代码:
class Node {}
class DerivedNode : public Node {}
class Graph {
vector<Node*> nodes;
}
class DerivedGraph : public Graph { }
目前我正在将DerivedNodes存储在DerivedGraph类中,例如:
nodes.push_back(new DerivedNode());
当我需要使用仅适用于DerivedNodes和DerivedGraphs的特定方法时 我被迫首先在我的Node指针上使用dynamic_cast。
我希望能够在DerivedGraph中使用仅适用于DerivedNodes的特定方法 并避免使用指针。如果最后我不介意重新设计我的课程 结果比我的好。
我确信必须有一个干净而简单的方法来实现我想要做的同样的事情。 也许有专门模板的东西?对此事的任何想法都会很大 赞赏。我还将提供我尚未提供的任何其他信息 清楚。
编辑:我没有两份副本。我想强调它的外观。我为演讲道歉。我想要获得的是:class DerivedGraph: public Graph {
vector<DerivedNode*> nodes;
}
答案 0 :(得分:1)
首先不要在派生类中复制数据成员。
然后添加用于向容器添加数据的虚拟成员函数。这样,您可以在派生类中创建派生类型的实例,并将它们添加到容器中。
最后,当您覆盖返回派生类中数据引用的虚函数时,请使用covariant return types。
答案 1 :(得分:1)
您确定您的Node
界面是否合适?有时当你发现自己需要向下转换时(特别是在这样的情况下,基本指针存储在容器中)这可能是一个信号,表明你的抽象接口无法正确满足你的所有需求。通常像模板方法模式这样的东西可以满足您的所有需求,而不需要任何垂头丧气。
但是,假设您的继承模型确实需要以这种方式工作,那么您可能想要做的是在DerivedGraph
中覆盖虚拟方法以添加和获取节点。 将必须验证节点类型并在此情况下向下转发。
最后一种方法是拥有两个独立的容器,一个在父级中,包含所有不是DerivedNode
的节点,然后是DerivedGraph
中包含所有DerivedNode
的另一个容器。然后再次使用重写函数来确定要访问的容器,具体取决于您的API需求。