在 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
继承自Node
,RBTree
继承自Tree
,那么一个RBNode是一个Node
而 RBTree
是 Tree
。事实上,只要这个函数是 public
或 protected
,并且继承本身是 public
或 protected
,你就可以在 [=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 中。派生节点和树将具有它们独有的任何功能。
下面是我编写的用于将节点插入简单二叉搜索树的代码。现在我试图通过将相同的节点 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
继承自Node
,RBTree
继承自Tree
,那么一个RBNode是一个Node
而 RBTree
是 Tree
。事实上,只要这个函数是 public
或 protected
,并且继承本身是 public
或 protected
,你就可以在 [=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 中。派生节点和树将具有它们独有的任何功能。