Вы добавляете virtual Base* clone() const = 0;
в свой базовый класс и соответствующим образом реализуете его в своих классах Derived. Если ваш Base
не абстрактный, вы можете, конечно, вызвать его конструктор-копию, но это немного опасно: если вы забудете реализовать его в производном классе, вы получите (возможно, нежелательную) нарезку.
Если вы не хотите дублировать этот код, вы можете использовать CRTP idiom для реализации функции через шаблон:
template
class DerivationHelper : public Base
{
public:
virtual Base* clone() const
{
return new Derived(static_cast(*this)); // call the copy ctor.
}
};
class Derived1 : public DerivationHelper { ... };
class Derived2 : public DerivationHelper { ... };
Я думаю, что самый простой подход для достижения этой цели - создать в таблице флаг для ролей, например, создать ключ is_admin для пользователей, которые являются администраторами. После, чем во время входа в систему, добавьте также проверку для пользователя, является ли флаг is_admin истинным или ложным. Если это правда, то создайте промежуточное ПО для этого и добавьте это промежуточное ПО в маршруты для администратора.