如何:派生类中的派生成员使用派生类特定方法

时间:2011-10-31 16:34:27

标签: c++ inheritance pointers template-specialization

我在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;
}    

2 个答案:

答案 0 :(得分:1)

首先不要在派生类中复制数据成员。

然后添加用于向容器添加数据的虚拟成员函数。这样,您可以在派生类中创建派生类型的实例,并将它们添加到容器中。

最后,当您覆盖返回派生类中数据引用的虚函数时,请使用covariant return types

答案 1 :(得分:1)

确定您的Node界面是否合适?有时当你发现自己需要向下转换时(特别是在这样的情况下,基本指针存储在容器中)这可能是一个信号,表明你的抽象接口无法正确满足你的所有需求。通常像模板方法模式这样的东西可以满足您的所有需求,而不需要任何垂头丧气。

但是,假设您的继承模型确实需要以这种方式工作,那么您可能想要做的是在DerivedGraph中覆盖虚拟方法以添加和获取节点。 必须验证节点类型并在此情况下向下转发。

最后一种方法是拥有两个独立的容器,一个在父级中,包含所有不是DerivedNode的节点,然后是DerivedGraph中包含所有DerivedNode的另一个容器。然后再次使用重写函数来确定要访问的容器,具体取决于您的API需求。