【问题标题】:Suggestions on C++ Inheritence关于 C++ 继承的建议
【发布时间】:2015-04-25 16:11:12
【问题描述】:

我一直在使用继承在 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++ 新手。

【问题讨论】:

    标签: c++ inheritance


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

    【讨论】:

    • 但我已经尝试过这种方法,但是 left_rotate_node() 和 right_rotate_node() 给出了很多段错误。
    • @rohit 我试图回答您的问题:“如何使用相同的函数而不在 RBNode 中重新声明它”。段错误可能有很多其他原因:通常是指针管理和访问 nullptr 的一些问题。我建议发布另一个具体问题,MCVE 和相关功能的实现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多