Немного ржавый на наследование класса C ++ - PullRequest
4 голосов
/ 26 октября 2011

Каковы правила для подкласса доступа к защищенным объектам-членам?Я думал, что понял их, но мой код не согласен.

У меня есть базовый класс, определяемый как

class Datum {
public:
   Datum(Datum *r, Datum *l) : right(r), left(l) {}

protected:
   Datum *right, *left;
};

Я подкласс Datum следующим образом:

class Column: public Datum
{
public:
   Column(Datum *r, Datum *l, string n, int s): Datum(r,l), name(n), size(s) {}

   void cover() {
      right->left = left;
      left->right = right;
   }

protected:
   string name;
   int size;
};

Когда яПри компиляции, используя G ++ v.4.5.1, я получаю сообщения об ошибках, указывающие на две строки в обложке:

error: Datum* Datum::right is protected
error:  within this context
error: Datum* Datum::left is protected
error:  within this context

Очевидно, что сделав раздел общедоступным, ошибки исчезнут.Почему они там, когда раздел защищен?

Ответы [ 2 ]

4 голосов
/ 26 октября 2011

Проблема в Datum::Datum *right защищена. Указатель right доступен / присваивается, поскольку базовый класс наследуется публично. Но объект, на который указывает right, не имеет доступа, превалирует так, как вы пытаетесь в функции-члене Column::cover(), потому что объект, на который указывает right, не имеет прямого отношения в текущей области видимости производного класса.

 void cover() {
      // Not posssible right->left = left;

      // But -
       right = new Datum(); // Assuming the class has default constructor.
 }

Аналогичная проблема и для Datum::Datum *left.

3 голосов
/ 26 октября 2011

Столбец получает доступ вправо и влево, когда они являются членами другого объекта Column, но не когда они являются членами произвольного объекта Datum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...