在C ++中有效地使用继承

时间:2015-04-26 06:32:33

标签: c++ inheritance

下面是我编写的用于将节点插入简单二进制搜索树的代码。现在我试图通过将相同的Node类继承到RBNode类来实现Red Black Tree。

void Node::insert_node(Tree *t)
{
    Node *cur_node = t->get_root();
    Node *prev_node;
    while(NULL != cur_node)
    {
        prev_node = cur_node;
        if(this->data < cur_node->data)
        {
            cur_node = cur_node->left;
        }
        else
        {
            cur_node = cur_node->right;
        }
    }


    if(NULL == t->get_root())
    {
        cur_node = this;
        t->set_root(cur_node);
    }
    else
    {
        if(this->data < prev_node->data)
        {
            prev_node->left = this;
        }
        else
        {
            prev_node->right = this;
        }
        this->parent = prev_node;
    }
}

对于RBNode,此函数将保持不变,除了Node *应由RBNode *替换,Tree *由RBTree *替换。我认为在RBNode类中编写相同的函数实际上完全相同,这是徒劳的。如果我使用相同的功能,我无法访问RBNode的成员,因为我插入树中的是节点。

实现这一目标的有效方法是什么?我是C ++的新手,所以如果我错过了任何明显的东西,请告诉我。

2 个答案:

答案 0 :(得分:2)

如果RBNode继承自NodeRBTree继承自Tree,则RBNode Node和{ {1}}是RBTree。事实上,只要此函数为Treepublic,并且继承本身为protectedpublic,您就可以在{{1}上调用它它会起作用。

这是一个小例子:

protected

答案 1 :(得分:2)

除了可以,你根本不需要使用继承。没有继承的解决方案是使用模板。如下:

template <class N, class T>
void insert_node(N *node, T *tree);

此代码适用于两种节点。这个问题是它必须位于全局或第三个不相关的类中。您可以让Node继承自抽象类INode,Tree继承自抽象类ITree。此功能将位于INode中。派生的节点和树将具有任何独特的功能。