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

Using Inheritence efficiently in C++

下面是我编写的用于将节点插入简单二叉搜索树的代码。现在我试图通过将相同的节点 class 继承到 RBNode class.

来实现红黑树
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 class 中编写相同的函数是徒劳的,它实际上做的是完全相同的事情。如果我使用相同的功能,我无法访问 RBNode 的成员,因为我插入到树中的是节点。

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

如果RBNode继承自NodeRBTree继承自Tree,那么一个RBNode是一个NodeRBTreeTree。事实上,只要这个函数是 publicprotected,并且继承本身是 publicprotected,你就可以在 [=11] 上调用它=] 它将起作用。

这是一个小例子:

class Base {
    public:
    int foo() {return 2;}
};

class Derived : public Base {
    //nothing
};

int main() {
    Derived d;
    cout<<d.foo()<<endl; //prints 2
}

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

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

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