У Adobe есть не идеальное решение для этого с использованием шаблонов.
Проблема в том, что, поскольку шаблоны не могут объявлять зависимых от аргументов друзей [*], он полагается на то, что конструктор защищен, а не приватен. Это частичное решение в том, что оно вызовет ошибку компилятора, когда кто-то по ошибке решит наследовать ваш класс, но это не полное решение, поскольку кто-то намеренно может форсировать наследование.
template <typename SealedClass>
class seal
{
protected:
seal() {}
};
class Sealed : private virtual seal<Sealed>
{
//...
};
class NaiveExtension : public Sealed { // fails
NaiveExtension() {} // NaiveExtension cannot call seal<Sealed> constructor
};
class BreakingExtension : public Sealed, private virtual seal<Sealed> {
BreakingExtension() : seal<Sealed>(), Sealed() {} // now it can
};
Преимущество заключается в том, что он может быть шаблонным (библиотека Adobe определяет макрос, который будет скрывать «частную виртуальную» от случайного читателя). Недостатком является то, что он может быть сломан.
Опять же, вы всегда можете сделать то, что предлагает C ++ FAQ для некоторых вопросов по блокировке некоторых функций:
'как я могу запретить людям ...': написать комментарий, чтобы не делать этого
'но как мне на самом деле запретить другим ...': написать комментарий: Вас уволят, если ...
'но как мне на самом деле заблокировать это, если они не следуют за комментарием?': уволить их
[*] Это ограничение будет снято с готовящимся стандартом, когда это возможно, когда это будет реализовано в компиляторах ...