【问题标题】:Using Inheritence efficiently in C++在 C++ 中有效地使用继承
【发布时间】:2015-04-26 06:32:32
【问题描述】:

下面是我编写的用于将节点插入到简单二叉搜索树中的代码。现在我正在尝试通过将相同的 Node 类继承到 RBNode 类来实现红黑树。

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++ 新手,所以如果我遗漏了任何明显的内容,请告诉我。

【问题讨论】:

  • 如果您的目标是获得最高效率,那么像这样的数据结构会涉及大量松散的指针追逐,这可能会导致大量缓存未命中。像 B+ 树这样更连续的数据结构可能会更快。此外,根据您的实际典型数据,您甚至可能不需要树。

标签: c++ inheritance


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    如果RBNode 继承自Node 并且RBTree 继承自Tree,那么RBNode 是一个 Node 并且RBTree 是一个Tree。事实上,只要这个函数是publicprotected,并且继承本身是publicprotected,你就可以在RBNode 上调用它,它就可以工作。

    这是一个小例子:

    class Base {
        public:
        int foo() {return 2;}
    };
    
    class Derived : public Base {
        //nothing
    };
    
    int main() {
        Derived d;
        cout<<d.foo()<<endl; //prints 2
    }
    

    【讨论】:

    • 是的。但是如果我使用相同的功能,我将无法访问 RBNode 的成员。
    • 不,您将无法访问任何特定于 RBNode 的成员。但是,您将能够访问也是 Node 成员的任何成员。如果您的目标是在此函数中具有不同的行为,那么您应该使用不同的函数(因为您想要不同的行为),或者更好的是,在 Node 中使用 RBNode 覆盖的虚函数。您也可以查看 dynamic_cast,但这并不总是最好的选择。
    • 非常感谢您的意见。我使用模板解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2011-02-10
    相关资源
    最近更新 更多