В некотором приложении определены следующие классы, определяющие роли пользователей этого приложения:
Visitor - незарегистрированный пользователь
User - пользователь с минимальными правами
Manager - пользователь с расширенными правами
Admin - администратор системы
Для любого пользователя системы, за исключением класса Visitor, определены следующие поля:
- логин пользователя - массив char[8]
- имя пользователя - массив типа char произвольной длины
- уровень прав пользователя в системе - целое поле, я его енумом сделал
Для каждого определены следующие правила:
- Визитор не имеет доступа ни к одному полю даже на чтение
- Юзер может только читать свои поля
- Менеджер может читать поля любого Юзера, кроме того может читать и менять свои имя и логин
- Админ соответственно может менять любое любого пользователя
Все классы должны входить в одну иерархию наследования, в которой базовым является Визитор.
Все классы должны иметь виртуальные методы void printInfo(User &user) и bool set(User *user, char *name)
Инфа о printInfo:
- для Визитора - строку ошибки
- для Юзера и Менеджера - собственные имя и логин
- для Админа - имя и логин того, кто передан по ссылке - ну аргументом функции
Инфа о set:
- Юзер - Access denied, return false
- Manager - замена собственного name
- Admin - устанавливает имя того пользователя, указатель на который передается в качестве первого параметра метода, второй параметр - это новое значение. true,false - успешно или нет выполнена операция.
Все, текст задания кончился.
Фраза про одну иерархию меня натолкнула на то, что одно другое наследует столбиком, хотя наверное Визитор можно сделать базовым для каждого из остальных. Тогда и проблема с протектед членами решится.
Далее, насчет переноса аттрибутов - раз уж Визитор будет базовым, логичнее их там оставить имхо.
0
|