I have made a superclass named "tree". I have constructed the tree in this class. Now, I want to pass the root of the constructed tree to another class which is a subclass of tree. But when I try to pass it, the subclass calls the supercalss constructor and sets it to NULL;
struct node
{
    struct node *left;
    struct node *right;
    int val;
};
struct node *create(int val)
{
    struct node *temp = (struct node *)malloc(sizeof(struct node));
    temp->val = val;
    temp->left = temp->right = NULL;
    return temp;
};
class tree
{
    public:
        struct node *root;
        tree()
        {
            root = NULL;
        }
        void createtree()
        {
            root = create(5);
        }
        void preorder()
        {
            preorderp(root);
        }
        void preorderp(struct node *p)
        {
            if(!p) {
                return;
            }
            cout<<p->val<<' ';
            preorderp(p->left);
            preorderp(p->right);
        }
};
This is the definition of my tree class. It just creates a tree with one node having value 5. Now I want to pass the new root created to a subclass of tree.
class treeiterator:public tree
{
    struct node *p;
    stack<struct node *> s;
    public:
        treeiterator()
        {   
            p = root;
            push(root);
        }
        bool hasnext();
        int next();
    private:
        void push(struct node *root);
};
I create an object for tree first and then do createtree. Now, when I create an object for treeiterator, it's member p gets sets to NULL since supercalss constructor is also called. How can I just access the tree created in the superclass in subclass? Full code:
#include <bits/stdc++.h>
using namespace std;
struct node
{
    struct node *left;
    struct node *right;
    int val;
};
struct node *create(int val)
{
    struct node *temp = (struct node *)malloc(sizeof(struct node));
    temp->val = val;
    temp->left = temp->right = NULL;
    return temp;
};
class tree
{
    public:
        struct node *root;
        tree()
        {
            root = NULL;
        }
        void createtree()
        {
            root = create(5);
        }
        void preorder()
        {
            preorderp(root);
        }
        void preorderp(struct node *p)
        {
            if(!p) {
                return;
            }
            cout<<p->val<<' ';
            preorderp(p->left);
            preorderp(p->right);
        }
};
class treeiterator:public tree
{
    struct node *p;
    stack<struct node *> s;
    public:
        treeiterator()
        {
            p = root;
            push(root);
        }
        bool hasnext();
        int next();
    private:
        void push(struct node *root);
};
void treeiterator::push(struct node *t)
{
    while(t) {
        s.push(t);
        t = t->left;
    }
}
bool treeiterator::hasnext()
{
    return s.empty()?1:0;
}
int treeiterator::next()
{
    struct node *t = s.top();
    int val = t->val;
    s.pop();
    if(t->right) {
        push(t->right);
    }
    return val;
}
int main()
{
    tree t;
    t.createtree();
    t.preorder();
    treeiterator it;
    while(it.hasnext()) {
        cout<<it.next()<<' ';
    }
}
 
     
     
    