关于C++继承的建议

Suggestions on C++ Inheritence

本文关键字:继承 C++ 关于      更新时间:2023-10-16

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

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 的情况下使用相同的函数。我想在函数内部使用强制转换,但我怎么知道哪个类对象正在调用该函数。

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

要么

继承没有正确定义,要么在Node中而不是在Tree中定义了insert_node(Tree *t)

无论如何,以下最小代码示例编译良好:

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继承说明符的情况下,假定私有继承:在类中,您可以访问基类的所有受保护成员和公共成员,但在类外部,您看不到继承的成员。 我想这就是发生在你身上的事情。