2015-04-25 17 views
1

我一直在C++中使用继承来实现红黑树。我有4个类,节点,树,RBNode,RBTree。关于C++继承的建议

class Node 
{ 
    protected: 
     int data; 
     Node *left; 
     Node *right; 
     Node *parent; 
    public: 
     Node(); 
     Node(int data); 
     void print_node(ofstream &file); 
     Node * find_node(int data); 
     void insert_node(Tree *t); 
     void left_rotate_node(Tree *t); 
     void right_rotate_node(Tree *t); 
     void delete_node(Tree *t); 
} 

class Tree 
{ 
    protected: 
     Node * root; 
     list<int> treedata; 
    public: 
     Tree(); 
     virtual Node * get_root(); 
     virtual void set_root(Node *root_node); 
     void insert_into_tree(); 
     void delete_from_tree(); 
     virtual void print_tree(); 
} 

RBNode和RBTree分别继承Node,Tree。但是我不能使用Node类的功能。例如,函数void Tree::insert_node(Tree *t);

即使在类RBNode中,除函数接收RBTree作为参数外,此函数也执行相同的工作。我怎样才能使用相同的功能,而无需在RBNode中重新声明它。我想在函数内部使用casting,但是我怎么知道哪些类对象正在调用函数。

请给我一些建议。我是C++新手。

回答

1

继承没有被正确定义,或者在insert_node(Tree *t)上有一个混淆,它在Node而不是在Tree中定义。

不管怎样,下面的最少的代码示例编译好:

class Tree; 
class Node 
{ 
protected: 
    int data; 
    Node *left,*right, *parent; 
public: 
    Node(int data=0) : data(data), left(nullptr), right(nullptr), parent(nullptr) {} 
    void insert_node(Tree *t) { cout << "Insert" << endl; } 
}; 
class Tree 
{ 
protected: 
    Node * root; 
    list<int> treedata; 
public: 
    Tree() : root(nullptr) {} 
}; 
class RBSnode : public Node {}; // public inheritance 
class RBStree : public Tree {}; 

... 
RBSnode n; 
RBStree t; 
n.insert_node(&t); 

注意,在缺少public继承符的,假设私有继承:在类中你有存取权限的所有protected和public成员基类,但在外面,类,你看不到继承的成员。我想这是发生在你身上的事情。

+0

但我已经尝试过这种方法,但left_rotate_node()和right_rotate_node()给出了很多seg故障。 –

+0

@rohit我试着回答你的问题:“*我怎样才能使用相同的功能,而不需要在RBNode中重新声明*”。 segfaults可能有很多其他原因:通常它是指针管理和访问nullptr的一些问题。我建议通过[MCVE](http://stackoverflow.com/help/mcve)发布另一个具体问题,并实施相关功能 – Christophe