如何:派生类中派生类的派生类与特定于派生类的方法

问题描述:

我在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 我不得不先在我的节点指针上使用dynamic_cast。

我希望能够在DerivedGraph中具体应用DerivedNodes ,避免需要投射指针。如果结果 的结果比我的要好,我不介意重新设计我的课程。

我确定必须有一个干净而简单的方法来实现我想要做的同样的事情。 也许用专门的模板?任何关于此事的想法都会大大促进 。我还会提供所需的任何附加信息,但我并不清楚 。

编辑:我没有两个副本。我想强调它的外观。我为演示道歉。我想获得的是:

class DerivedGraph: public Graph { 
    vector<DerivedNode*> nodes; 
}  
+2

为什么你有**两个**节点的拷贝? –

+0

@Morat:再次检查。 'DerivedGraph'具有一个'nodes'成员,并且它也继承'Graph'的'nodes'成员。所以'DerivedGraph'有两个'节点'成员。 –

+0

我明白你的意思。我会重新编辑我原来的问题,因为它似乎会产生混淆。我的实际代码没有节点容器两次。 – Morat

你是肯定你的界面在Node是合适的吗?有时,当你发现自己需要向下转发(特别是在基本指针存储在容器中的情况下),这可能表明你的抽象接口不能正确覆盖所有需求。通常类似于模板方法模式可以解决您的所有需求,而不需要任何沮丧。

但是,假设您的继承模型真的需要这样工作,您可能想要做的是在DerivedGraph中添加和获取节点的虚拟方法。在这种情况下,您需要验证节点类型并向下转发。

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

+0

我认为在这里新来的人在描述我的问题时遇到了问题。下面的细节是否会以任何方式改变你的建议:我知道DerivedGraph必须并且只会包含DerivedNodes。我需要DerivedGraph具有普通图形的所有功能以及一些额外的功能,但它只包含DerivedNodes。这就是为什么我认为这可以通过专门的模板解决的原因。只是一个想法。 – Morat

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

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

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

+0

是的,但是当我在需要访问DerivedNode的成员的DerivedGraph中有方法时,我仍然需要将节点指针转换为DerivedNode指针。任何方法来避免演员? – Morat

+0

您无法完全避免投射,但如果您的类的不变量保证投射始终成功,您可以使用'static_cast'来避免'dynamic_cast'的运行时成本。 –