Наследование проблем - PullRequest
       7

Наследование проблем

2 голосов
/ 20 октября 2010
class Base
{
   private:
      int var;
};

class Child : protected Base
{
   void someFunc()
   {
      var = 5; // Error: Base::var is private
   }
};

Что там не так?

Ответы [ 4 ]

4 голосов
/ 20 октября 2010

Попробуйте это:

class Base
{
   protected:
      int var;
};

См. эту ссылку для разницы между частным, защищенным и общедоступным в c ++.

3 голосов
/ 20 октября 2010

Что плохого в том, что вы пытаетесь получить доступ к закрытой переменной из другого класса, который не является другом.

Самый простой выход - сделать var защищенным, а не частным, но это вводит дополнительные зависимости. Как правило, переменные должны быть закрытыми. Страуструп в своей книге «Дизайн и эволюция C ++» пожалел о введении protected. Он считает защищенные данные приглашением к проблемам, и, по его опыту, в этом нет необходимости. Открытие элементов данных для произвольных манипуляций любым объявленным подклассом на самом деле не намного лучше, чем их публичное использование.

Когда возникает искушение использовать защищенные элементы данных, вы должны спросить себя, чего вы на самом деле пытаетесь достичь. Это явно построенный пример. Если для Child была какая-то причина изменить var, эту причину можно выразить в имени функции, и защищенные функции не так плохи, как защищенные члены данных.

0 голосов
/ 20 октября 2010

Вы объявили var для личного доступа в Base.Приватный означает, что только этот класс может видеть эту переменную, а не подклассы.

Я думаю, что вы, вероятно, хотите защищенный доступ в этом случае: protected означает, что этот класс и любой подкласс может видеть его.Данг, также избили его.

0 голосов
/ 20 октября 2010

Даже с наследованием protected или private вы не получите доступ к использованию private членов в родительских классах.

Сделайте их protected, если вам действительно нужен доступ к нимнапрямую.

Редактировать: черт побери.

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