2015-04-25 44 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