Admin (наследуются друг от друга). Есть таблица в БД где есть вся информация о каждом пользователе и тип 0 = User, 1 = Moderator, 2 = Admin.
В классе Database не хочу писать три метода, которые будут абсолютно одинаковыми, только вызвать разные конструкторы в конце для разных классов пользователей.
Либо делаете фабрику, либо весь функционал в одном классе, управляемый типом пользователя
Т.е. тип пользователя просто как enum в классе?
class User { private: std::string username; public: User(const User&) = default; User& operator=(const User&) = default; User(User&&) = default; User& operator=(User&&) = default; virtual ~User() = default; }; class Moderator : public User { private: std::string some_info_about_moderator; public: Moderator(const Moderator&) = default; Moderator& operator=(const Moderator&) = default; Moderator(Moderator&&) = default; Moderator& operator=(Moderator&&) = default; virtual ~Moderator() = default; virtual ban_user(User&); }; class Admin final : public Moderator { private: std::string some_info; public: Admin(const Admin&) = default; Admin& operator=(const Admin&) = default; Admin(Admin&&) = default; Admin& operator=(Admin&&) = default; ~Admin() = default; ban_user(Moderator&) override; }; Вот какой-то такой код. Я вытаскиваю из БД строчку из таблицы users и только там узнаю, какого типа будет возвращаемый результат. Всегда возвращать User, а потом делать downcast? Как-то криво.
Или просто сделать метод, который достаёт Admin, а get_Moderator() и get_User() будут просто делать return get_Admin() ?
С вашей схемой вам не нужен get_Moderator() и get_Admin(). Сделайте ban_user у User, просто у него он ничего не будет делать или ошибку кидать, и добавьте проверку virtual bool isModerator()/isAdmin() const;.
" добавьте проверку virtual bool isModerator()/isAdmin() const;" не понял
А вам точно категории нужны, возможно лучше работать с системой прав?
На юзере сделайте две этих функции, на модераторе перекройте isModerator, на админе isAdmin перекройте.
тогда полиморфизма ведь не будет.
Полиморфизм это иллюзия
Обсуждают сегодня