Речь идет об «защищенном», что объясняется следующим образом: «Когда класс наследует другой, члены производного класса могут обращаться к защищенным членам, унаследованным от базового класса». Тем не менее, посмотрите на этот код:Когда защита защищает слишком много
class Base {
public:
Base(int m) : member(m){}
protected:
int member;
};
class Derived : public Base { // one of several subclasses
public:
Derived(int m) : Base(m), value(10) {}
int diff(Base x){
return value - x.member;
}
private:
int value;
};
Производная обращается «x.member», который защищен в его базовом классе, правильно? Но компилятор помещает ошибку, «Base :: member защищен». И, обдумав это на минуту, я должен был согласиться с компилятором.
И вот вопрос: Как это сделать, с минимальной потерей информации?
- Очевидно, что создание «участника» публично компилируется, но оно против первоначального намерения.
- Использование механизма «друга» в базе, чтобы подклассы могли получить доступ к «члену» (и все остальное, что является частным и защищенным) еще хуже (кроме немой привязки суперкласса к его собственным подклассам - кошмар обслуживания).
- В простом примере public int getMember() {return member; } будет приемлемым. Но если тип участника - это X *, то лучше всего сделать это публично const X * getMember() {...}.
Я что-то пропустил?
Просто определите 'int diff (Derived x)' или нет? – mb84
Также, читая ваши точки 1 и 3, можно сделать вывод, что смысл защиты-члена-члена состоит в том, что он может быть прочитан, но не изменен. Таким образом, метод get будет делать это хорошо. Также возможен публичный const-reference или const-pointer-to-const для члена, который инициализируется в списке конструкторов Base. Ваша точка 3 и «лучшее, что вы можете сделать ... ** const ** X *" зависит от того, что вы хотите: метод get возвращает значение в любом случае. Таким образом, вы не можете изменить значение члена типа X * с помощью 'X * get()'. Только то, на что это указывает. – mb84
Как сделать функцию 'int diff (Derived d, Base b)' и сделать эту функцию «другом» обоих классов? – rozina