C++ 处理自引用的派生类

标签 c++ design-patterns derived-class derived

假设我在 C++ 中有一个这样的树类

class Node{
    void addChild(Node*);
    /*obvious stuff*/
    protected:
        Node* parent;
        vector<Node*> children
}

class specialNode : public Node{
    void addChild(specialNode*);
    /*obvious stuff*/
    /*special stuff*/
}

现在,每当我访问specialTree 中的子级时,我显然会得到Node*,而不是specialNode*。

但是这个特殊的Node*具有Node所没有的成员变量和函数。

我可以强制specialNode只将specialNode作为子节点,否则会在编译时中断, 但在访问子/父时我仍然得到 Node*,并且每当我想使用特殊函数时我都必须强制转换它,即使是在特殊 Node 函数中也是如此。

有什么聪明的或者更好的方法来解决这个问题吗? 除了每次都直接转换之外?

最佳答案

如果您的树中只需要 SpecialNode 对象(并且只想将所有通用树功能封装在 Node 中),您可以创建 Node所谓的“混合”类,例如

template <class N>
class Node : public N {
public:
  void addChild(Node<N>*);
protected:
  Node<N>* parent;
  vector<Node<N>*> children;
};

class SpecialNodeBase {
  // Here comes all "special" data/methods for your "special" tree
};

typedef Node<SpecialNodeBase> SpecialNode;

之后,您可以构造一个 SpecialNode 对象树,并使用 SpecialNodeBase 中的所有方法以及 Node 中的其他树管理函数

关于C++ 处理自引用的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3507600/

相关文章:

c++ - 注释掉 cout 语句会导致不同(和不正确)的输出

.net - 无效 C++/CLI 的 ISO C++ 代码示例

javascript - Jquery 不良做法

C++ 设计 : Pool and pointers VS client-server

C++使变量类型取决于用户输入

java - 在 Java 中设计规则引擎的有效设计模式/风格是什么?

python - Django 休息框架 : Derived model serializer fields

c++ - 重写的函数没有反射(reflect)在基类中,这是正常行为吗?

c++ - 有没有办法防止在派生类的实例上调用基类方法?

c++ - ROS:将回调函数和对象成员绑定(bind)到订阅者节点