Обычный пример с юнитом.
class Unit {
private:
int health;
public:
Unit(int health);
virtual ~Unit();
protected:
virtual void setHealth(int newHealth);
далее делаем наследника
class Healer : public Unit {
public:
Healer(int health);
virtual void healing(Unit* other);
};
В реализации лечения:
void Healer::healing(Unit* other) {
other->setHealth(100);
}
И вот инкапсуляция не разрешает так делать. other->setHealth(100);
'setHealth' is a protected member of 'Unit' other->setHealth(newHealth);
can only access this member on an object of type 'Healer' virtual void setHealth(int newHealth);
При этом для this вызвать этот метод можно.
Мне, кажется, надо добавить вам интерфейс типа IHealable например. И, далее, действовать через него. Например сделать ещё один класс HealableUnit: Unit, IHealable и в методе healing работать с интерфейсом, а не с методом.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей