Наследование и права доступа


0

Здравствуйте. Возникает некая неоднозначность, просьба пояснить. Так при вызове метода Add() из области protected проблем не возникает, однако деструктор жалуется, что не может обратиться к Delete(). Заранее, благодарю за помощь.

template <typename DataType> class Node
{
protected:
    Node(DataType data, Node *left = NULL, Node *right = NULL)
        :Data(data), Left(left), Right(right){}

    Node()
        :Left(NULL), Right(NULL){};

    void Delete()
    {
        if (Left)  
            Left->Delete();

        if (Right)
            Right->Delete();

        Node *tmp = this;
        delete tmp;
    }

    void AddNode(DataType);

    void AddNodeFirst(DataType);

    DataType Data;
    Node *Left, *Right;
};

template <typename DataType> class Btree: public Node<DataType>
{
public:
    Btree()
        :_isset(false)
    {
        Left = NULL;
        Right = NULL;
    }

    ~Btree()
    {
        if (Left)
            Left->Delete();

        if(Right)
            Right->Delete();
    }

    void Add(DataType data)
    {
        if (_isset)
        {
            AddNode(data);
            return;
        }

        AddNodeFirst(data);
        _isset = true;
    }

private:
    bool _isset;
};

int main()
{
Btree<int> root;
root.Add(7);
root.Add(8);
}
Источник
  •  3567
  •  2
  • 10 янв 2012 2012-01-10 03:22:28

2 ответа

2

Код очень плохой, если честно. Какие тут есть недостатки:

  1. Как уже написали выше, за delete this надо отрывать руки.
  2. Наследовать дерево от узла — плохая идея. Дерево - не узел.
  3. Зачем-то в конструкторе Btree дублируются действия из конструктора Node.

По поводу вашего вопроса. Да, в C++ можно обращаться к protected полям и методам базового класса из унаследованного только по указателю на объект унаследованного класса:

class A {
protected:
    virtual void foo() {};
};

class B : public A {
public:
     void bar(A* a, B* b) {
          foo(); //можно
          b->foo(); //можно
          a->foo(); //нельзя
     }
};
  • 10 янв 2012 2012-01-10 08:20:33
Спасибо, исправил — 10 янв 20122012-01-10 08:20:50.000000
Небольшая описочка. Не к private полям а к protected. — 10 янв 20122012-01-10 08:15:53.000000
1

Не кошерно в методе класса удалять самого себя (this).